从django模型的save方法中提出ValidationError?

sly*_*ete 12 python django

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

我试着提高django.forms.ValidationError,但管理员表格似乎没有注意到这一点.该模型在保存时进行远程过程调用,如果输入有效,则在此调用之前不知道.

谢谢,皮特

Cer*_*rin 11

从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)
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*man 8

目前无法在模型保存方法中执行验证.然而,这是作为单独的模型验证分支开发的,并且应该在接下来的几个月内合并到主干中.

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

  • 它是Django 1.2的一部分:http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects (5认同)
  • django最近一直在捣乱我.我采用这种方法,但我不满意.修改模型的代码不属于干净方法. (3认同)
  • 目前(Django 1.4)有一种在模型保存方法中执行验证的方法.`def save(self,*args,**kwargs):\ self.full_clean()\ super(YourModel,self).save(*args,**kwargs)`.我为此创建了一个mixin:https://gist.github.com/glarrain/5448253 (2认同)