模型的clean()方法和form的clean()方法之间是否有任何关系?

时间:2015-04-28 00:18:08

标签: python django

我已经覆盖了某些模型的clean()方法来构造约束以满足我的数据库模式要求(因为它需要这些验证的运行时信息)。

现在我已经完成了大部分后端组件(模型信号,..),现在我试图写{{1我的模特。

我想知道的是,ModelForm模型方法与表单方clean()实现之间是否存在任何关系?

如果是这样,并且表单clean()调用模型clean()我不必重写我的模型 - clean()实施,并且能够避免代码冗余。

2 个答案:

答案 0 :(得分:3)

是的,ModelForm清洁涉及模型清洁。这是ModelForm的想法:有很多有用的默认值,可以通过从模型中自动构建表单对象来确定。

我通过个人经验发现了这种干净的链接,但为了支持它我可以参考来源。

在1.8上,ModelForm调用模型实例full_clean方法。在1.7上,它直接调用clean方法。

Form.full_clean()

def full_clean(self):
    # ..... snip
    self._clean_fields()
    self._clean_form()
    self._post_clean()

ModelForm._post_clean for 1.8

模型full_clean()在其他验证中调用clean()https://docs.djangoproject.com/en/1.8/ref/models/instances/

self.instance.full_clean(exclude=exclude, validate_unique=False)

ModelForm._post_clean for 1.7

self.instance.clean()

答案 1 :(得分:1)

根据Model.cleanModelForm s clean,我认为它们之间没有任何关系。

这两个clean具有相同的名称,但他们做了不同的工作。

Model.clean用于验证您要存储到数据库中的数据,并确保数据正常并可以存储到数据库中。

  

此方法应用于提供自定义模型验证,并根据需要修改模型上的属性。

根据我的理解,

ModelForm clean用于验证用户输入的内容,并确保其正常。

  

您可以覆盖模型表单上的clean()方法,以便以与普通表单相同的方式提供其他验证。

在正常形式上,它是:

  

在必须为相互依赖的字段添加自定义验证时,在表单上实现clean()方法。

我认为this也是你想要的:

  

请注意,我们在这里讨论表单上的clean()方法,而早些时候我们在字段上编写了一个clean()方法。在确定验证事物的位置时,保持字段和形式差异是很重要的。字段是单个数据点,表单是字段的集合。