我已经覆盖了某些模型的clean()
方法来构造约束以满足我的数据库模式要求(因为它需要这些验证的运行时信息)。
现在我已经完成了大部分后端组件(模型,信号,..),现在我试图写{{1我的模特。
我想知道的是,ModelForm
模型方法与表单方clean()
实现之间是否存在任何关系?
如果是这样,并且表单clean()
调用模型clean()
我不必重写我的模型 - clean()
实施,并且能够避免代码冗余。
答案 0 :(得分:3)
是的,ModelForm
清洁涉及模型清洁。这是ModelForm
的想法:有很多有用的默认值,可以通过从模型中自动构建表单对象来确定。
我通过个人经验发现了这种干净的链接,但为了支持它我可以参考来源。
在1.8上,ModelForm
调用模型实例full_clean
方法。在1.7上,它直接调用clean
方法。
def full_clean(self):
# ..... snip
self._clean_fields()
self._clean_form()
self._post_clean()
模型full_clean()
在其他验证中调用clean()
:https://docs.djangoproject.com/en/1.8/ref/models/instances/
self.instance.full_clean(exclude=exclude, validate_unique=False)
self.instance.clean()
答案 1 :(得分:1)
根据Model.clean
和ModelForm
s clean
,我认为它们之间没有任何关系。
这两个clean
具有相同的名称,但他们做了不同的工作。
Model.clean
用于验证您要存储到数据库中的数据,并确保数据正常并可以存储到数据库中。
根据我的理解,此方法应用于提供自定义模型验证,并根据需要修改模型上的属性。
ModelForm
clean
用于验证用户输入的内容,并确保其正常。
您可以覆盖模型表单上的clean()方法,以便以与普通表单相同的方式提供其他验证。
在正常形式上,它是:
在必须为相互依赖的字段添加自定义验证时,在表单上实现clean()方法。
我认为this也是你想要的:
请注意,我们在这里讨论表单上的clean()方法,而早些时候我们在字段上编写了一个clean()方法。在确定验证事物的位置时,保持字段和形式差异是很重要的。字段是单个数据点,表单是字段的集合。