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

12 投票
2 回答
13608 浏览
提问于 2025-04-15 14:35

我需要在一个模型的保存方法中引发一个异常。我希望这个异常能被任何使用这个模型的django ModelForm捕获,包括后台管理表单。

我试着引发 django.forms.ValidationError,但后台管理表单似乎没有捕获到这个异常。这个模型在保存时会进行一次远程过程调用,而在这个调用之前并不知道输入是否有效。

谢谢,Pete

2 个回答

15

自从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)

这样做的好处是,它在管理后台和其他地方都能正常工作。

9

目前在模型保存方法中没有办法进行验证。不过,正在开发一个单独的模型验证功能,预计在接下来的几个月里会合并到主版本中。

在这段时间里,你需要在表单层面进行验证。创建一个 ModelForm 的子类并添加一个 clean() 方法是很简单的,这个方法可以进行远程调用并根据情况抛出异常。你可以在后台管理和其他表单中都使用这个方法。

撰写回答