使用 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_python
和 validate
在到达 clean_some_field
之前被调用。在对字段进行子类化并覆盖 to_python
和 validate
之后,我让它工作了。希望有人会发现这在某些时候有用!
我正在尝试在 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_python
和 validate
在到达 clean_some_field
之前被调用。在对字段进行子类化并覆盖 to_python
和 validate
之后,我让它工作了。希望有人会发现这在某些时候有用!