我正在使用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)
因此,当用户注册时,除了col1
,col2
和{{1}之外,它还要求提供其他字段(username
,email
) }。
以下是注册视图。
password
因此,只要用户通过备用表单注册,就会调用上面的视图。
现在,相反,当用户从社交帐户FB注册时,它不会要求额外信息,即user = User.objects.create_user(username, user_email, user_pass)
Profile.objects.create(user=user, col1=col1, col2=col2)
return
。它直接注册而不需要额外的信息,我也不想要它。
然后我使用信号在col1/col2
模型后注册中创建一行。
Profile
所以,(1)我的问题是在使用备用表单创建用户时,@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)
表中没有插入记录,我觉得很奇怪。
(2)考虑一下,我使用E1作为电子邮件ID使用备用表格注册。现在我通过allauth
以相同的ID注册,它会抛出错误。
(3)如何使用allauth(FB)
向使用备用表格注册的用户发送确认邮件。
答案 0 :(得分:2)
我在图书馆玩了一下,最后找到了我的问题的解决方案。我将其粘贴在这里供其他人审核。
添加信号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')))