从 django 模型的保存方法中引发 ValidationError?

Posted

技术标签:

【中文标题】从 django 模型的保存方法中引发 ValidationError?【英文标题】:Raising ValidationError from django model's save method? 【发布时间】:2010-12-01 05:27:17 【问题描述】:

我需要在模型的保存方法中引发异常。我希望存在一个异常,任何使用此模型(包括管理表单)的 django ModelForm 都会捕获该异常。

我尝试提出django.forms.ValidationError,但这似乎没有被管理表单捕获。模型在保存时进行远程过程调用,直到此调用才知道输入是否有效。

谢谢,皮特

【问题讨论】:

【参考方案1】:

从 Django 1.2 开始,这就是我一直在做的事情:

class MyModel(models.Model):

    <...model fields...>

    def clean(self, *args, **kwargs):
        if <some constraint not met>:
            raise ValidationError('You have not met a constraint!')
        super(MyModel, self).clean(*args, **kwargs)

    def full_clean(self, *args, **kwargs):
        return self.clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(MyModel, self).save(*args, **kwargs)

这有利于在管理员内部和外部工作。

【讨论】:

【参考方案2】:

目前无法在模型保存方法中执行验证。然而,它正在开发中,作为一个单独的模型验证分支,并应在未来几个月内合并到主干中。

与此同时,您需要在表单级别进行验证。使用clean() 方法创建ModelForm 子类非常简单,该方法执行远程调用并相应地引发异常,并在管理员中使用它并作为其他表单的基础。

【讨论】:

django 最近让我很生气。我采用了这种方法,但我并不满意。修改模型的代码不属于干净的方法。 刚刚签到,你说的这个分支被合并了吗? 它是 Django 1.2 的一部分:docs.djangoproject.com/en/dev/ref/models/instances/… 目前(Django 1.4)有一种在模型保存方法中执行验证的方法。 def save(self, *args, **kwargs):\ self.full_clean()\ super(YourModel, self).save(*args, **kwargs)。我为此创建了一个 mixin:gist.github.com/glarrain/5448253

以上是关于从 django 模型的保存方法中引发 ValidationError?的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?

Django绑定表单无效,但未引发ValidationError

Django,模型表格未在数据库中保存数据

跟进:缺少 django Modelform 中所需的 Charfield 被保存为空字符串并且不会引发错误

Django显示来自另一个函数的形式错误

不使用 django 表单如何验证和保存表单数据