【问题标题】:Is there any relationship between model's clean() method and form's clean() method?模型 clean() 方法和表单 clean() 方法之间有什么关系吗?
【发布时间】:2015-07-06 15:20:09
【问题描述】:

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

从现在开始,我已经完成了大部分后端组件(modelssignals、..),现在我正在尝试写 ModelForms for我的模型。

我想知道的是,模型的clean() 方法和表单端的clean() 实现之间有什么关系吗?

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    在 1.8 上,ModelForms 调用模型实例 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 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 1.7

    self.instance.clean()
    

    【讨论】:

      【解决方案2】:

      根据Model.cleanModelFormsclean,我认为他们之间没有任何关系。

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

      Model.clean用于验证你要存入数据库的数据,确保数据是ok的,可以存入数据库。

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

      ModelForms clean,据我了解,是为了验证用户输入的内容,并确保他们没问题。

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

      在正常形式上,它是:

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

      我认为this 也是您想要的:

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

      【讨论】:

        猜你喜欢
        • 2011-08-19
        • 2019-03-20
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多