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

Hen*_*ryM 1 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
Run Code Online (Sandbox Code Playgroud)

我们的想法是,如果密码匹配,并且username是有效的,那么我设置emailusername。但我只是得到错误(Hidden field email) This field is required

这个应该怎么设置。

Bes*_*ung 5

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

email = forms.EmailField(
    widget=forms.HiddenInput(),
    required = False,
    initial="dummy@freestuff.com"
)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

在那里你不必隐藏一个带有虚拟值的字段,我认为它是“更干净的”。