如何更改 Django Rest Framework 和 Django allauth 中的注册表单?

问题描述

我正在使用 Django Rest 框架构建 API,其中 Django Allauth 负责我的注册注册。实施后一切正常:

Signup Form

在此注册表单上,我想删除用户名字段并将其替换为年龄字段。我知道,要实现这一点,我需要配置 ACCOUNT_FORMS,但是我应该如何创建此表单?

# settings.py

ACCOUNT_FORMS = {
    "signup": "user.forms.MyCustomSignupForm",}

# models.py

class User(AbstractBaseUser,PermissionsMixin):
    """Custom user model that supports using email instead of username"""
    email = models.EmailField(max_length=255,unique=True)
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email


# forms.py

from django import forms
from allauth.account.forms import SignupForm


class MyCustomSignupForm(SignupForm):

解决方法

我有一个自定义的 allauth 注册表单,它只需要一个电子邮件地址。

我的表格是这样的;

# settings.py
ACCOUNT_FORMS = {
    'signup': 'accounts.forms.SignupForm',}
from django import forms
from django.conf import settings
from django.utils.translation import ugettext,ugettext_lazy as _

from allauth.account.forms import SignupForm as BaseSignupForm


class SignupForm(BaseSignupForm):
    email = forms.EmailField(
        widget=forms.TextInput(
            attrs={
                'type': 'email','placeholder': _('E-mail address')
            }
        )
    )

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        if settings.SIGNUP_EMAIL_ENTER_TWICE:
            self.fields["email2"] = forms.EmailField(
                label=_("E-mail (again)"),widget=forms.TextInput(
                    attrs={
                        'type': 'email','placeholder': _('E-mail address confirmation')
                    }
                )
            )

        self.fields['email'].label = ugettext("E-mail")
        self.fields['email'].required = True

        to_remove = [
            'username','password1','password2'  # ignored when not present
        ]
        for field in to_remove:
            if field in self.fields:
                del self.fields[field]

所以你可以做这样的事情,只需添加你的 age 字段。

,

在此注册表单上,我想删除用户名字段并替换 它用于 Age 字段。我知道,要实现这一点,我需要配置 ACCOUNT_FORMS,但是我应该如何创建这个表单?

创建新的注册表单不会改变任何内容。您无需在此处创建注册表单即可更改注册中的必填字段。您需要在您的用户模型和设置中进行更改。

REQUIRED_FIELDS 中注册您的必填字段,如下所示。

class User(AbstractBaseUser,PermissionsMixin):
    """Custom user model that supports using email instead of username"""
    email = models.EmailField(max_length=255,unique=True)
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    objects = UserManager()
    USERNAME_FIELD = 'email'
    # email is added to this list automatically
    REQUIRED_FIELDS = ['name','age'] 
    def __str__(self):
        return self.email
        

并且您需要在 settings.py 井中进行必要的更改,例如:

ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = True

您可以根据需要更改选项.. 现在注册表将有 5 个字段:电子邮件、姓名、年龄、密码 1、密码 2。

然后您可以通过覆盖 allauth 的注册表单来创建自己的注册表单以添加自动对焦或更新小部件等。

from allauth.account.forms import SignupForm as allauth_SignupForm
    
class SignupForm(allauth_SignupForm):
    def __init__(self,**kwargs):
        super(SignupForm,self).__init__(*args,**kwargs)
            self.fields['email'].widget.attrs.update(
                {"autofocus": "autofocus","class": "form-control"})