Django all_auth和自定义表单

时间:2016-11-03 12:36:47

标签: django django-allauth django-registration

我正在使用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)

因此,当用户注册时,除了col1col2和{{1}之外,它还要求提供其他字段(usernameemail) }。

以下是注册视图。

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)向使用备用表格注册的用户发送确认邮件。

1 个答案:

答案 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')))