Django-allauth适配器重定向

4
我正在利用django-allauth为我的物业管理应用程序提供Google身份验证。以下是我正在寻找的注册流程:
1. 新管理员进入注册页面,看到“使用Google注册”的按钮。 2. 他们单击该按钮并登录Google。 3. 在从Google返回后,他们将被提示填写其他信息的表格。 4. 当他们提交此表单后,将创建他们的用户帐户和管理员配置文件,并将重定向到其公司的主页。
我尝试通过适配器处理这个“重定向到公司主页”的问题。我遇到的问题是,“get_login_redirect_url”函数在初始Google登录之后执行,但在我收集他们的工作时间表的注册表单之前调用适配器重定向,因此我在适配器重定向时会得到一个DoesNotExist错误,因为它是在managerprofile创建之前调用的。
正确的重定向方式是什么?
settings.py

ACCOUNT_SIGNUP_FORM_CLASS = 'managers.signup.ManagerProfileSignupForm'
SOCIALACCOUNT_AUTO_SIGNUP = False
SOCIALACCOUNT_ADAPTER = 'managers.adapter.ManagerSocialAccountAdapter'
ACCOUNT_ADAPTER = 'managers.adapter.ManagerAccountAdapter'


adapters.py

class ManagerSocialAccountAdapter(DefaultSocialAccountAdapter):
    def get_connect_redirect_url(self, request, socialaccount):
        return reverse('company_details', args=(request.user.managerprofile.company.pk,))

class ManagerAccountAdapter(DefaultAccountAdapter):
    def get_login_redirect_url(self, request):
        return reverse('company_details', args=(request.user.managerprofile.company.pk,))

1
你是否找到了解决这个问题的方法? - Ahmed Aeon Axan
兄弟,你找到解决方案了吗? - Abhimanyu Singh
2个回答

0

你需要定义一个装饰器,其中包含在创建账号之前运行的函数。看这里

#imports necessary for decorator call
from allauth.exceptions import ImmediateHttpResponse
from allauth.socialaccount.signals import pre_social_login
from allauth.account.utils import perform_login
from django.dispatch import receiver
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.socialaccount.models import SocialLogin

# defining class to run through authentication
class SocialAccountAdapter(DefaultSocialAccountAdapter):
def pre_social_login(self, request, sociallogin):
    pass

# reciever defining function to hold the account before making it registered
@receiver(pre_social_login)
def link_to_local_user(sender, request, sociallogin, **kwargs):
    socialemail = sociallogin.user.email
    socialuname = socialemail.split('@')[0]
    sociallogin.user.username = socialuname+str(sociallogin.user.pk)

    if User.objects.filter(email=sociallogin.user.email).exists():
        user = User.objects.get(email=sociallogin.user.email)
        if user:
            perform_login(request, user, email_verification='optional')
            raise ImmediateHttpResponse(redirect('homePage'))
    else:
        SocialLogin.save(sociallogin, request, connect=False)
        user = User.objects.get(email=sociallogin.user.email)
        perform_login(request, user, email_verification='optional')
        raise ImmediateHttpResponse(redirect('homePage'))

假设您已经创建了一个信号,该信号在用户模型实例创建时直接创建一个映射到用户的配置文件模型实例。如果没有,请使用以下经理配置文件模型:

def create_profile(sender, instance, created, **kwargs):
    if created:
        <ManagerProfileModel>.objects.create(userID=instance)

 post_save.connect(create_profile, sender=<UserModelWhereMainAccountIsCreated>)

0

在您的应用程序的settings.py中设置LOGIN_REDIRECT_URL:

我有这个值,用于重定向到主页:

LOGIN_REDIRECT_URL = '/'

1
我使用LOGIN_REDIRECT_URL设置的问题在于我无法动态设置该值。根据用户的不同,我可能会将其重定向到/companies/1或/companies/2。我认为您必须实现一个适配器来获取这种动态重定向。 - Jeff Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接