使用带有下划线的字段的clean()进行ModelForm验证

时间:2015-09-08 14:32:41

标签: python django django-forms

我正在尝试在ModelForm上实现自定义验证,但是我遇到了一个名称中包含下划线的字段的问题。

假设我有这个模型:

class MyModel(models.Model):
    foo = models.IntegerField()
    bar_qux = models.IntegerField()

当我尝试定义自定义验证时,我使用clean_<fieldname>()方法。例如:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('foo', 'bar_qux')

    def clean_foo(self):
        # Do stuff

    def clean_bar_qux(self):
        # Do other stuff

这样做,clean_foo()方法完美无缺,但clean_bar_qux()方法永远不会被调用,似乎原因是bar和{{1}之间的下划线}。

如何定义此方法?

2 个答案:

答案 0 :(得分:3)

字段名称中的下划线不会停止调用clean方法。

请注意,如果字段验证失败,则不会调用clean_<fieldname>方法(例如,如果您将字符串&#39; 22&#39;传递给字段而不是整数&#39; 22& #39)。如果您在致电form.errors后打印或记录form.is_valid(),则可能会显示问题所在。

答案 1 :(得分:0)

我以为我也有这个问题,现在我想知道为什么了。如果您阅读Django official documentation on form and field validation,则会发现在到达to_python之前,每个字段的validateclean_some_field被调用了。在将字段子类化并覆盖to_pythonvalidate之后,我开始工作了。希望有人会在某个时候发现它有用!