【问题标题】:Basic validation disabled when overriding clean method in Django modelforms在 Django 模型中覆盖 clean 方法时禁用基本验证
【发布时间】:2016-05-10 09:35:14
【问题描述】:

我一遍又一遍地阅读 Django 文档,但我一直在为模型表单中的 clean() 方法苦苦挣扎。

这是我的models.py:

class Profile(models.Model):

    number1 = models.IntegerField(blank=True, null=True)
    number2 = models.IntegerField(blank=True, null=True)

class FormProfile(ModelForm):

    def clean(self):

        number1 = self.cleaned_data.get('number1')
        number2 = self.cleaned_data.get('number2')

        if number1 >= number2:

            raise forms.ValidationError("number1 should not be above number2")

    class Meta:

        model = Profile

clean() 验证已正确完成,但问题是 number1 和 number2 的基本验证(应该是整数)不再引发任何错误。 例如,如果 number1 是整数但 number2 不是整数,则cleaned_data 字典将只包含 number1,这是正常的,因为 number2 没有经过验证,但不会引发错误。

如何让 Django 先引发基本错误,然后仅在没有引发基本错误时才执行 clean() 方法?

谢谢!

【问题讨论】:

    标签: python django validation django-forms


    【解决方案1】:

    您所说的基本验证是通过BaseFormclean 方法调用的,当您覆盖此方法时,您隐藏了底层验证。

    你需要在你的 clean 方法中通过 super 调用 ModelForms base clean 方法

       def clean(self):
           super(FormProfile, self).clean()
    

    docs 中的示例所示,您仍然需要检查一个值是否在您的检查中为空,因此它将变为

     if number1 and number2 and number1 >= number2:
    

    您可以使用.get 提供默认值,但我不建议这样做,因为它会使此检查更难验证正确的结果

    【讨论】:

    • 好的,谢谢。我刚刚在number1 = self.cleaned_data.get('number1') 之前添加了super(FormProfile, self).clean(),但问题是它不会阻止我的自定义 clean() 方法运行。所以我的 number2 等于 None 并且它在 if number1 >= number2 期间引发错误(无法将 None 与整数进行比较)。如果父 clean() 方法引发错误,有没有办法阻止自定义 clean() 方法运行?再次感谢
    • 好的,这正是我现在要做的。谢谢!
    【解决方案2】:
    def clean(self):
        # your validation
        return super(FormProfile, self).clean()
    

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多