我正在使用django-registration
来管理我的注册。我试图在Django应用程序中强制我的用户名和电子邮件地址相同,并且尝试通过以下注册表进行操作:
class NoUsernameRegistrationForm(RegistrationForm):
"""
Form for registering a new user account.
Requires the password to be entered twice to catch typos.
Subclasses should feel free to add any additional validation they
need, but should avoid defining a ``save()`` method -- the actual
saving of collected user data is delegated to the active
registration backend.
"""
username = forms.CharField(
widget=forms.EmailInput(attrs=dict(attrs_dict, maxlength=75)),
label=_("Email address"))
password1 = forms.CharField(
widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
label=_("Password"))
password2 = forms.CharField(
widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
label=_("Password (again)"))
email = forms.EmailField(
widget=forms.HiddenInput(),
required = False)
def clean(self):
"""
Verify that the values entered into the two password fields
match. Note that an error here will end up in
``non_field_errors()`` because it doesn't apply to a single
field.
"""
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
if self.cleaned_data['password1'] != self.cleaned_data['password2']:
raise forms.ValidationError(_("The two password fields didn't match."))
"""
Validate that the email address is not already in use.
"""
try:
user = User.objects.get(username__iexact=self.cleaned_data['username'])
raise forms.ValidationError(_("A user with that email address already exists."))
except User.DoesNotExist:
self.cleaned_data['email'] = self.cleaned_data['username']
self.cleaned_data['username']
return self.cleaned_data
这个想法是,如果密码匹配并且username
有效,那么我将email
设置为username
。但是我只收到错误(Hidden field email) This field is required
我应该如何设置。
答案 0 :(得分:3)
对于您的答案,您可以按照注释中的说明进行操作,但是可以直接从字段定义中进行:
email = forms.EmailField(
widget=forms.HiddenInput(),
required = False,
initial="dummy@freestuff.com"
)
或者只声明一个没有电子邮件字段的表单(因此在您的示例中:username
,password1
和password2
),然后在表单的save方法中处理用户名/电子邮件部分:< / p>
def save(self, commit=True):
user = super().save(commit=False) # here the object is not commited in db
user.email = self.cleanned_data['username']
user.save()
return user
您不必隐藏带有虚拟值的字段,我认为这是“更干净的”。