Django表单未调用clean\lt;fieldname>;

Django表单未调用clean\lt;fieldname>;,django,django-forms,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

我正在尝试验证一个表单(以前它是可以工作的)。由于某些原因,我似乎无法在调用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
类登录表单(forms.Form):
username=forms.CharField(最大长度=30)
密码=forms.CharField(最大长度=30,小部件=forms.PasswordInput)
def clean_密码(自身):
打印“清洗密码”
password=self.cleaned_数据['password']
如果密码==u“”:
raise forms.ValidationError(“密码为空”)
返回密码
def clean_用户名(自我):
username=self.cleaned_数据['username']
如果len(用户名)<4:
raise forms.ValidationError(“用户名少于四个字符”)
返回用户名
班级登记表(登录信息表):
确认密码=forms.CharField(widget=forms.PasswordInput,最大长度=30)
email=forms.EmailField()
def clean_确认_密码(自我):
打印“清洗确认密码”
clean\u confirm\u password=自清理的\u数据['confirm\u password']
如果清除\u确认\u密码==u“”:
raise forms.ValidationError(“确认密码为空”)
返回干净的\u确认\u密码
def清洁(自清洁):
打印“在注册表上运行清洁”
打印self.cleaned_data.items()
password=self.cleaned_数据['password']
确认=自清理的\u数据['confirm\u password']
如果输入密码!=确认:
raise forms.ValidationError('密码不匹配')
返回自清理的_数据

谢谢大家!

在潜入Django源之后,我发现了错误的来源

如果某个字段留空,则表单在调用
field.clean()
后会为该字段引发ValidationError,但随后它不会调用
clean\uu
,但仍会调用该类的主clean方法。为了处理使用这些空白字段的干净方法,您必须执行以下操作:

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

    return self.cleaned_data

您可以通过在字段构造函数中使用
required=False
来覆盖此选项

username = forms.CharField(max_length=30, required=False)
password = forms.CharField(max_length=30,widget=forms.PasswordInput, required=False)

对于您的示例来说,这似乎不合逻辑,但如果其他实例用于深入研究forms.py,则可能会很有用。让我惊讶的是,人们竟然不去研究可用的源代码。这可能会很可怕。我害怕意外地改变和保存一些重要的东西。不理智,我知道什么时候整件事都可以轻易地被替换