在 Django 表单中设置隐藏字段的值



我正在使用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

我应该如何设置。

因此,对于您的答案,您可以按照评论中所说的进行操作,但直接从字段定义中进行操作:

email = forms.EmailField(
widget=forms.HiddenInput(),
required = False,
initial="dummy@freestuff.com"
)

或者只是声明一个没有电子邮件字段的表单(所以在你的例子中:usernamepassword1password2(,并在表单的保存方法中处理用户名/电子邮件部分:

def save(self, commit=True):
user = super().save(commit=False) # here the object is not commited in db
user.email = self.cleaned_data['username']
user.save()
return user

在那里,您不必隐藏具有虚拟值的字段,我认为这是"更干净"的。

最新更新