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

ModelForm validation with clean() for field with underscores

我正在尝试在 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 和 [= 之间的下划线16=].

如何定义这个方法?

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

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

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