【问题标题】:Django: Does model_instance.clean() run before basic validators?Django:model_instance.clean() 在基本验证器之前运行吗?
【发布时间】:2010-01-26 20:14:55
【问题描述】:

假设我有一个模型:

class Ticket(models.Model):
    client = models.ForeignKey(Client)
    color = models.CharField(max_length=255)

    def clean(self):
        self.color = self.client.favorite_color

当我在最新的 Django(15 分钟前的 SVN 的负责人)上运行此程序时,如果我在没有选择 client 的情况下点击保存,我会从我的 clean 方法中收到 DoesNotExist 错误(对于 @987654327 @ 部分)。由于模型需要client 属性,难道不应该在我在clean() 中的自定义验证之前处理这个问题吗?

这是我正在阅读的文档:http://docs.djangoproject.com/en/dev/ref/models/instances/#id1

【问题讨论】:

  • 可以在模型上使用 clean 功能吗?我以为它只适用于 ModelForms?
  • @D4V360:OP指的是SVN版本。引入了clean 方法。查看所有模型方法:docs.djangoproject.com/en/dev/ref/models/instances/…
  • 如果你要拉下 SVN,请从修订版 #12267 拉。在 #12268 中并转发直到他们修复它(我输入了一张票),如果你提出一个 ValidationError('with a string like this which isdocumented'),在 django.forms.models 中会发生一个运行时错误,因为漏洞。 12268 是引入该错误的地方。
  • 如果您对 orokusaki 所说的内容感到好奇,请查看 code.djangoproject.com/ticket/12698

标签: django django-models django-validation


【解决方案1】:

如果有人遇到这个问题,我想通了:

在模型的 full_clean() 中,首先运行 clean_fields(),但不会引发显示等错误。相反,它们只是简单地添加到 dict(),然后是 clean(),这是自定义验证方法运行您的模型以将您的任何自定义错误添加到字典中。只有在那之后才会再次引发错误。

【讨论】:

    【解决方案2】:

    clean() 是 ModelForms 的可调用对象,而不是模型。

    See the docs.

    在模型级别做你想做的事,override the save() method.

    评论后编辑:好吧,看来是时候重新阅读文档了,即将发布 1.2。 :-) 感谢您指出。

    【讨论】:

    • clean() 现在也是一种模型方法。这是一个链接:docs.djangoproject.com/en/dev/ref/models/instances/#id1
    • @celopes 哈哈,我知道。我会抱怨,但我的项目已经足够早了,我每周都会关闭 SVN 并在我进行时解决错误,因为这种模型验证是我一直梦寐以求的事情,而且还有更多新的东西,比如 queryset.exists()等。如果您打算使用 SVN 进行此新验证,我会获取修订版 #12268。
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多