我正在尝试在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}之间的下划线}。
如何定义此方法?
答案 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
之前,每个字段的validate
和clean_some_field
被调用了。在将字段子类化并覆盖to_python
和validate
之后,我开始工作了。希望有人会在某个时候发现它有用!