【问题标题】:Django form not calling clean_<fieldname>Django 表单不调用 clean_<fieldname>
【发布时间】:2009-12-09 05:21:19
【问题描述】:

我正在尝试验证一个表单(它以前可以工作)。出于某种原因,我似乎无法在调用 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

谢谢!

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    在深入了解 Django forms.py 源代码后,我发现了错误的根源。

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

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

    【讨论】:

    • +1 用于挖掘 forms.py。令我惊讶的是,人们不会查看可用的源代码。
    • 这可能很可怕。我害怕不小心改变和保存一些重要的东西。非理性,我知道什么时候可以轻松更换整个东西。 ;-)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2013-02-01
      • 2015-05-29
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多