2017-08-31 40 views
0

我試圖阻止保存模型,如果我有一個頁面更新名稱被更改。所以防止模型保存並從pre_save信號引發驗證錯誤

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 

不過試過,我不能將傳播到模型的save()方法的信號內提出一個ValidationError。當我嘗試這個時,我得到了Django調試頁面 - 不像你所期望的那樣顯示名稱字段旁邊的錯誤。

任何幫助非常感謝!

回答

2

您可以覆蓋__init__方法來保存舊名稱值,然後在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'}) 
+1

非常感謝 - 真正有用的 - 有很多瞭解Django的! – Newfoundland