django-allauth-覆盖默认注册表单

8

我正在使用以下代码(在forms.py中)为我的自定义注册表单进行allauth:

class RegistrationForm(UserCreationForm):
    birth_date = forms.DateField(widget=extras.SelectDateWidget(years=BIRTH_DATE_YEARS))

    class Meta:
        model = get_user_model()
        fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name', 'gender', 'birth_date', 'city', 'country')

我当然在settings.py中指定了ACCOUNT_SIGNUP_FORM_CLASS指向这个表单并显示我放入其中的字段。然而,在提交时它不起作用,即使我加上了signup方法也从未被调用过。我尝试使用save但还是出现相同的情况-在创建用户并保存到数据库时会出现自定义添加的一个字段为空的错误。

那么,实现这个的正确代码应该是什么呢?


也许你的项目设置中缺少了allauth选项!请查看我的答案并尝试适应。 - Mbambadev
我并不是说过了吗?我已经设置了ACCOUNT_SIGNUP_FORM_CLASS,表单也正确地显示了所有字段。问题在于提交表单的时候。 - softzer0
2个回答

15

多亏了@rakwen,他在这里找到了正确的解决方案。 我编写了自己的适配器并将其放在我的应用程序中的adapters.py文件中:

from allauth.account.adapter import DefaultAccountAdapter

class AccountAdapter(DefaultAccountAdapter):
    def save_user(self, request, user, form, commit=False):
        data = form.cleaned_data
        user.username = data['username']
        user.email = data['email']
        user.first_name = data['first_name']
        user.last_name = data['last_name']
        user.gender = data['gender']
        user.birth_date = data['birth_date']
        user.city = data['city']
        user.country = data['country']
        if 'password1' in data:
            user.set_password(data['password1'])
        else:
            user.set_unusable_password()
        self.populate_username(request, user)
        if commit:
            user.save()
        return user

然后我在 settings.py 中指定了 ACCOUNT_ADAPTER 指向该适配器,最终它开始工作了!


4
在您的项目setting.py文件中,请尝试添加以下行:
请验证是否已添加此行:
AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
    "allauth.account.auth_backends.AuthenticationBackend",
)

ACCOUNT_SIGNUP_FORM_CLASS = "yourapp.forms.customSignupForm"

在 app.models 中

class CustomModel(models.Model):
    """CustomModel docstring."""

    city = forms.CharField(max_length=75)
    country = forms.CharField(max_length=25)
    other....

在 app.forms 中:
class SignForm(forms.ModelForm):
    """SignForm docstring."""

    username = forms.CharField(
        max_length=30,
    )
    first_name = forms.CharField(
        max_length=30,
    )
    last_name = forms.CharField(
        max_length=30,
    )
    field...

    def myclean():

    def signup(self, request, user):
        """You signup function."""


    # dont forget to save your model

    class Meta:
        model = mymodel.CustomModel
        fields = [
            'city',
            'country',
            'field...',
        ]

尝试这种方法很有效!

尝试了所有方法,但signup方法从未被调用。这似乎更像是allauth本身的问题,而不是我的代码问题。 - softzer0
看看我的答案,然后像我一样去做! - Mbambadev
刷新此页面并再次查看我的答案! - Mbambadev
好的,所以你们转到聊天了,但是我们所有人都没有得到回答,我的clean()函数是做什么用的?@rakwen,你能帮忙吗? - ronit
Ronit 你好吗?我可以帮助你! - Mbambadev
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接