2012-04-06 43 views
0

我有一個Django模型的撲救,這是令人難以置信的簡單:Django的:拒絕模型基於特定標準

class Person(models.Model): 
    name = models.CharField(max_length=100) 

我要否認這種模式如果實際名稱更改的儲蓄,但我想允許更改大寫。因此,例如:

SAM -> sAm: allowed 
Sam -> SAM: allowed 
Sam -> John: not allowed 

我如何重寫我的人模型的save()方法,使這樣的編輯被拒絕?特別是,我正在努力:

  1. 獲取訪問save()方法中的對象的預保存版本。
  2. 當保存被拒絕時,在Django的管理區域內向用戶顯示一條消息。
  3. 當保存被拒絕時,將用戶返回到編輯屏幕。

隨意自行回答問題的任何部分,並提前致謝!

回答

0

我會用一個表格,並在「乾淨」的方法,一些自定義的驗證:

例如:

class MyForm(ModelForm): 
    class Meta: 
     model = MyModel 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     name = cleaned_data.get("name ") 
     if name == ###: 
      #custom validition checking here 
      raise forms.ValidationError('You can only capitalize.') 
     return cleaned_data 
+0

一個很好的答案,謝謝,但我真的想在模型級別強制執行此操作,而不是在特定的表單上執行此操作。 – 2012-04-06 19:43:07

1

This answer有兩個很好的方法來檢測一個字段是否已經改變,做一些事情。

在你的情況下,你會修改它不僅檢測一個字段是否發生了變化,而且還檢測它是否是你想要允許的變化。

+0

謝謝,其中一個答案真的很好。你知道有什麼方法可以從'save()'方法傳回一個好消息給用戶界面嗎?它看起來不像可以在Django中使用內置消息,因爲您無法訪問'request'對象。 – 2012-04-06 19:57:37

+0

@Sam'save()'可以在沒有請求的情況下被調用,例如在Python shell中,它不適合在'save'中訪問請求的地方。 – okm 2012-04-07 06:09:17