Django表示不调用clean_ <fieldname>

Sap*_*Sun 8 django django-forms

我正在尝试验证表单(之前曾用过).出于某种原因,我似乎无法在调用form.is_valid()时调用各种清理函数,例如clean_username(self).

我知道还没有足够的支票(他们正在建设你看;-)),但这是我的课程:

  class LoginForm(forms.Form):
    username = forms.CharField(max_length=30)
    password = forms.CharField(max_length=30,widget=forms.PasswordInput)

    def clean_password(self):
        print "Cleaning password"
        password = self.cleaned_data['password']
        if password == u"":
            raise forms.ValidationError("Password is blank.")
        return password

    def clean_username(self):
        username = self.cleaned_data['username']
        if len(username) < 4:
            raise forms.ValidationError("Username is fewer than four charecters.")
        return username


class RegistrationForm( LoginForm ):
        confirm_password = forms.CharField(widget=forms.PasswordInput, max_length=30)
        email = forms.EmailField()

        def clean_confirm_password(self):
            print "Cleaning confirm password"
            clean_confirm_password = self.cleaned_data['confirm_password']
            if clean_confirm_password == u"":
                raise forms.ValidationError("Confirming password is blank.")
            return clean_confirm_password

        def clean(self):
            print "Running clean on a registration form"
            print self.cleaned_data.items()
            password = self.cleaned_data['password']
            confirm = self.cleaned_data['confirm_password']
            if password != confirm:
                raise forms.ValidationError('Passwords do not match.')
            return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sap*_*Sun 26

我潜入Django forms.py源后发现了错误的根源.

似乎如果一个字段留空,表单在调用之后会为该字段引发ValidationError field.clean(),但它不会调用clean_<fieldname>,但它仍然会调用该类的主干净方法.为了处理使用这些空白字段的干净方法,您必须执行以下操作:

def clean(self):
    try:
        password = self.cleaned_data['password']
        # etc
    except KeyError:
        raise ValidationError('The password field was blank.')

    return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

  • +1用于挖掘forms.py.我很惊讶人们如何不查看可用的源代码. (7认同)

Zac*_*ach 6

您可以required=False在字段构造函数中使用来覆盖它.

username = forms.CharField(max_length=30, required=False)
password = forms.CharField(max_length=30,widget=forms.PasswordInput, required=False)
Run Code Online (Sandbox Code Playgroud)

这对您的示例来说似乎不合逻辑,但如果是其他实例则可能很有用