问题描述
我正在使用 Django Rest 框架构建 API,其中 Django Allauth 负责我的注册注册。实施后一切正常:
在此注册表单上,我想删除用户名字段并将其替换为年龄字段。我知道,要实现这一点,我需要配置 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"})