自定义 Django allauth 的社交帐户注册表单:添加密码字段

2024-01-12

我正在尝试修改用户从社交帐户提供商登录时显示的注册表单。

这是我的自定义注册表单代码:

from allauth.socialaccount.forms import SignupForm
from allauth.account.forms import SetPasswordField, PasswordField


class SocialPasswordedSignupForm(SignupForm):

    password1 = SetPasswordField(label=_("Password"))
    password2 = PasswordField(label=_("Password (again)"))

    def confirm_password(self):
        print('entered confirm_password')
        if ("password1" in self.cleaned_data
                and "password2" in self.cleaned_data):
            print('password fields found')
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                print('passwords not equal')
                raise forms.ValidationError(_("You must type the same password"
                                              " each time."))
            print('passwords equal')
            return self.cleaned_data["password1"]
        else:
            print('passwords not found in form')
            raise forms.ValidationError(_("Password not found in form"))

    def signup(self, request, user):
        print('signup in SocialPasswordedSignupForm')
        password = self.confirm_password()
        user.set_password(password)
        user.save()

设置.py:

SOCIALACCOUNT_FORMS = {
    'signup': 'users.forms.SocialPasswordedSignupForm'
}

但问题是,我的注册方法永远不会被调用,所以,confirm_password方法也没有被调用,并且没有对密码进行验证。也就是说,如果我输入两个不同的密码,则保存第一个密码。

可能出什么问题了?


您是否设置此值 SOCIALACCOUNT_AUTO_SIGNUP = False ?这是为了确保成功验证后,用户将被重定向到您的注册表单。

我来到你的链接是因为我必须实现完全相同的功能。这就是我最后的做法。

forms.py

class SocialPasswordedSignupForm(SignupForm):

    password1 = SetPasswordField(max_length=6,label=("Password"))
    password2 = PasswordField(max_length=6, label=("Password (again)"))

    #taken from https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py

    def clean_password2(self):
        if ("password1" in self.cleaned_data and "password2" in self.cleaned_data):
            if (self.cleaned_data["password1"] != self.cleaned_data["password2"]):
                raise forms.ValidationError(("You must type the same password each time."))
        return self.cleaned_data["password2"]

    def signup(self, request, user):
        user.set_password(self.user, self.cleaned_data["password1"])
        user.save()

我想到探索原始代码https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py并发现没有像 clean_password1() 这样的函数,但有 clean_password2() 正在执行预期的工作。所以只需按原样复制它即可,一切正常:)

如果它对您有用,请不要忘记接受它作为答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Django allauth 的社交帐户注册表单:添加密码字段 的相关文章

随机推荐