如果我有一个更新名称更改的页面,我试图阻止模型保存。理想情况下,我会使用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调试页面 - 而不是像你期望的那样显示名称字段旁边的错误。
非常感谢任何帮助!
答案 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'})