防止模型保存并从pre_save信号中提出验证错误

时间:2017-08-31 16:16:05

标签: django

如果我有一个更新名称更改的页面,我试图阻止模型保存。理想情况下,我会使用clean方法并引发验证错误:

def clean (self):
    // if the name of the page has changed
    raise ValidationError({'name':'Sorry you cannot change this'})

但是,我无法获取原始名称以将其与新实例名称进行比较(我可以吗?)

然后我尝试使用信号,这使我能够获取原始名称

@receiver(pre_save, sender=Page)
def prevent_save_if_name_same(sender,**kwargs):
    instance = kwargs.get('instance')
    old_model = sender.objects.get(pk=instance.id)
    if old_model.name == instance.name:
        // i would like to raise a validation error

但是,我无法从信号中引发ValidationError,该信号将传播到模型save()方法。当我尝试这个时,我得到了Django调试页面 - 而不是像你期望的那样显示名称字段旁边的错误。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您可以覆盖__init__方法以保存old_name值,然后在clean方法中使用此值:

class MyModel(models.Model):
    def __init__(self, *args, **kwargs):
        super(Person, self).__init__(*args, **kwargs)
        self._old_name = self.name

    def clean(self):
        if self._old_name != self.name:
            raise ValidationError({'name':'Sorry you cannot change this'})