Django-allauth с несколькими моделями профилей

У меня есть проект django, в котором есть несколько моделей профилей, каждая из которых имеет внешний ключ для модели пользователя. Он использует django-allauth для регистрации.

В настоящее время при регистрации с использованием социальной учетной записи пользователь регистрируется, создается Пользователь и социальная учетная запись, затем пользователь перенаправляется на форму для заполнения, в зависимости от того, какой тип профиля он / она выбрал ранее, и после заполнения этой формы создан правильный тип профиля.

Я бы хотел, чтобы экземпляры типа пользователя, социальной учетной записи и профиля создавались на одном и том же этапе, то есть после того, как пользователь заполнил форму для конкретного профиля. Могу ли я сделать это без изменения кода allauth's? Было бы несложно сделать это, изменив allauth, но я бы предпочел не поддерживать пользовательскую копию стороннего приложения, если это может помочь.

Использование кастомного адаптера исключено, потому что у него нет доступа к запросу.


person elssar    schedule 31.07.2013    source источник
comment
Если ответ был удовлетворительным, было бы полезно, если бы вы его приняли. Если нет, пожалуйста, прокомментируйте, чтобы мы могли найти правильный ответ.   -  person Throoze    schedule 02.09.2013
comment
Ой, извини. Был немного занят, и ответ на ответ вылетел из головы   -  person elssar    schedule 02.09.2013


Ответы (1)


Взгляните на сигнал allauth.account.signals.user_signed_up, который срабатывает сразу после регистрации пользователя (социального или обычного). Вы можете делать свои вещи со своей учетной записью там:

from django.dispatch import receiver
from allauth.account.signals import user_signed_up

@receiver(user_signed_up)
def do_stuff_after_sign_up(sender, **kwargs):
    request = kwargs['request']
    user = kwargs['user']
    # Do your stuff with the user
    user.save()

Из репозитория django-allauth:

# Typically followed by `user_logged_in` (unless, e-mail verification kicks in)
user_signed_up = Signal(providing_args=["request", "user"])

Чтобы узнать, как использовать сигналы в django, прочтите официальную документацию по этому поводу.

Я надеюсь, что это поможет вам!

РЕДАКТИРОВАТЬ

Я рад, что вы нашли решение своей проблемы, но, поскольку промежуточные программы загружаются всегда, я бы предложил использовать предложенный мной подход. Модуль socialaccount из django-allauth также предоставляет сигналы. Среди них вы можете найти allauth.socialaccount.signals.social_account_added:

# Sent after a user connects a social account to a his local account.
social_account_added = Signal(providing_args=["request", "sociallogin"])

С помощью обработчика, аналогичного ранее написанному, вы можете проверить пользовательскую модель на наличие обязательных полей, а затем вызвать перенаправить или вернуть HttpResponseRedirect объект, который перенаправляет на представление, которое показывает/обрабатывает вашу форму.

person Throoze    schedule 29.08.2013
comment
Ну, это не сработает для нас, так как нам нужно, чтобы пользователь заполнил форму после регистрации в социальной сети. Что мы сделали, так это создали специальное ПО промежуточного слоя, которое перенаправляет любого пользователя, не заполнившего эту форму, на страницу формы. - person elssar; 02.09.2013
comment
@elssar: я отредактировал ответ, надеюсь, он будет полезен. С уважением. - person Throoze; 02.09.2013
comment
спасибо за редактирование. Перенаправление пользователя на соответствующую форму не было проблемой. Проблема заключалась в том, что произойдет, если они не заполнят эту форму. Они по-прежнему могли войти в систему и просматривать сайт. Мы не хотели, чтобы пользователи с неполными профилями делали это. - person elssar; 02.09.2013
comment
Это оправдывает загрузку промежуточного программного обеспечения. В таком случае я бы тоже воспользовался вашим подходом. - person Throoze; 02.09.2013
comment
@elssar, не могли бы вы поделиться своим промежуточным программным обеспечением? Мы столкнулись с одной и той же проблемой (несколько моделей профилей) и хотели бы посмотреть, как вы это сделали. Спасибо - person awidgery; 17.10.2014
comment
@AndrewWidgery извиняюсь, я забыл, что именно я делал, и, поскольку я сменил работу, у меня нет доступа к коду. - person elssar; 24.10.2014
comment
@AndrewWidgery на самом деле, я думаю, мы отказались от пользовательского промежуточного программного обеспечения и гарантировали, что модель пользователя не будет сохранена, пока пользователь не заполнит нашу форму профиля. К сожалению, все, что я помню, это то, что я создал подкласс адаптера социальной учетной записи и что-то там сделал. Могу попытаться выяснить, что я сделал, если у меня будет время на выходных - person elssar; 10.12.2014