Django-allauth with multiple profile models

我们两清 提交于 2019-12-01 07:24:54

问题


I have a django project in which there are multiple profile models, each having a foreign key to the User model. It uses django-allauth for registration.

Currently, when registering using a social account, the user registers, a User and a socialaccount is created, then the user is redirected to a form to fill out, depending on what profile type s/he chose earlier, and after filling out that form is the correct profile type created.

I'd like it if the user, socialaccount and profile type instances are created in the same step, that is after the user fills out the profile specific form. Is there anyway I can do this without changing allauth's code? It wouldn't be too hard to do this by modifying allauth, but I'd rather not maintain a custom copy of a 3rd party app if it can be helped.

Using a custom adapter is out, because it does not have access to the request.


回答1:


Take a look at the allauth.account.signals.user_signed_up signal, which is triggered just after the user (social or normal) signs up. You can do your stuff with your account there:

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()

From django-allauth repo:

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

To learn how to use signals in django, read the official documentation about it.

I hope it helps you!

EDIT

I'm glad you found your way through your problem, but since middlewares are loaded always, I would suggest using the approach I proposed. The socialaccount module from django-allauth also provide signals. Among them, you can find the 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"])

With a handler similar to the previously written, you can check the user model for the required fields, and then call the redirect shortcut, or return an HttpResponseRedirect object that redirects to the view that shows/handle your form.



来源:https://stackoverflow.com/questions/17963323/django-allauth-with-multiple-profile-models

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!