gpt4 book ai didi

Django all_auth 和自定义表单

转载 作者:行者123 更新时间:2023-12-02 01:20:42 26 4
gpt4 key购买 nike

我正在使用 django allauth 进行社交登录/注册。另外,我有自己的注册表单作为备用登录/注册。以下是我以替代形式从用户那里获取的字段。

class Profile(models.Model):
col1 = models.CharField(max_length=50, blank=True, null=True)
col2 = models.CharField(max_length=50, blank=True, null=True)
user = models.OneToOneField(User)

所以,当用户注册时,除了username,它还会要求额外的字段(col1col2),电子邮件密码

以下是注册 View 。

user = User.objects.create_user(username, user_email, user_pass)
Profile.objects.create(user=user, col1=col1, col2=col2)
return

因此,每当用户通过备用表单注册时,都会调用上述 View 。

现在,相比之下,当用户从社交帐户 FB 注册时,它不会要求额外的信息,即 col1/col2。它直接注册而不要求额外信息,我也不希望它询问。

然后我使用信号在 Profile 模型后注册中创建一行。

@receiver(user_signed_up)
def create_profile(request, user, sociallogin=None, **kwargs):
if sociallogin:
if sociallogin.account.provider == 'facebook':
data = sociallogin.account.extra_data
col1 = data.get('col1')
col2 = data.get('col2')
Profile.objects.create(user=user, col1=col1, col2=col2)

所以,(1) 我的问题是在使用备用表单创建用户时,allauth 表中没有插入任何记录,我觉得这很奇怪

(2) 考虑一下,我使用 E1 作为电子邮件 ID 使用替代表单注册。现在我使用相同的 ID 通过 allauth(FB) 注册,它会引发错误。

(3) 如何向使用 all_auth 以替代形式注册的用户发送确认邮件。

最佳答案

我对图书馆进行了一番尝试,终于找到了我的问题的解决方案。我将它粘贴到这里以供其他人查看。

添加一个信号 pre_social_login 来检查条件。

class MySocialAccountAdapter(DefaultSocialAccountAdapter):

def pre_social_login(self, request, sociallogin=None, **kwargs):
if sociallogin:
user = User.objects.filter(email=email).first()
# If user already exists in custom local form, then login directly.
# Save/Update his details in social login tables.
if user:
# create or update social login tables to maintain the uniformity in the code.
token = sociallogin.token.token
socialaccount = SocialAccount.objects.filter(user=user).first()
if socialaccount: # If it exists, then update social tables.
# updating account.
socialaccount.extra_data = extra_data
socialaccount.save()
# updating token.
SocialToken.objects.filter(account=socialaccount) \
.update(token=token)
else: # else create.
# saving Social EmailAddress.
EmailAddress.objects.create(email=email, user=user)

# saving social account.
provider = 'facebook'
kwargs = {
'uid': extra_data.get('id'),
'provider': provider,
'extra_data': extra_data,
'user': user
}
socialaccount = SocialAccount.objects.create(**kwargs)

# saving social token.
app = SocialApp.objects.get(provider=provider)
kwargs = {
'token': token,
'account': socialaccount,
'app': app
}
SocialToken.objects.create(**kwargs)

# finally login.
user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)
raise ImmediateHttpResponse(redirect(reverse('index')))

关于Django all_auth 和自定义表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40401688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com