Django all_auth 和自定义表单

Django all_auth and custom form

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

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)

因此,当用户注册时,除了 usernameemailpassword.

以下是注册视图。

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

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

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

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

@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')))