2012-07-08 50 views
3

這應該是一個Django特定的,但我想它是Python。Django - 保留原始方法的工作並添加新的自定義驗證

基本上,我不想重寫我繼承的類中的原始方法的工作(可能是一個Model類),但我想添加額外的驗證。 這可能嗎?任何提示?

class MyUserAdminForm(forms.ModelForm): 
    class Meta: 
     model = User 

    def clean(self): 
     // do some additional work even though it's cleaned by parent's clean method 

回答

5

調用super類清潔方法:

def clean(self): 
    super(MyUserAdminForm, self).clean() 
    # more cleaning 

這是一個常見的蟒蛇的事情時,你繼承的東西,functionaly重新定義,但想要讓做的一定要保持超類的功能。在執行init方法時非常常見,因爲您始終需要確保調用超類構造函數來設置實例。

+1

對於OP,請注意''super'的問題:第一個參數是* current *類的名稱。 – 2012-07-08 19:29:00

+0

@jdi謝謝。這是非常有用的知道。我正在考慮同樣的事情,但我只看到過__init__'被使用。所以我可以用任何'clean_'方法做同樣的事情,或者只是碰巧有任何方法:) – User007 2012-07-08 19:31:24

+0

@ User007:雅幾乎。就像我說的那樣,init的超級普通,所以我相信你已經看到了它。 'super()'是一個幫助函數,用於查找要調用的正確的超類方法。這是一個明智的做法'forms.ModelForm.clean(self)'。超級數字出哪個班級給你打電話「乾淨」。 – jdi 2012-07-08 21:32:59

0
class ContactForm(forms.Form): 
     message = forms.CharField() 
     def clean_message(self): 
       num_words = len(message.split()) 
       if num_words<4: 
         raise forms.ValidationError("Too short a message!") 
       return message 

這是您在字段中添加驗證方法的方式,這確實可以確保發生默認清理。沒有必要再次調用默認的清理方法。

來源:www.djangobook.com

工作原理:

當is_valid()被調用的表單對象時,系統會在類與clean_開始和結尾的任何方法屬性名稱。如果他們這樣做,它運行之後運行默認的清理方法。

+0

謝謝。我知道這一點,但我認爲這不會解決我的問題。默認的清理是特定的wdiget。如果它是一個密碼字段,它有它自己的默認清理。如果您從自己的Form/ModelForm繼承,並且如果您只是放入'clean_message',您將覆蓋您在父類中定義的原始方法。這是我遇到的問題。 – User007 2012-07-08 19:34:46

+0

'clean_ ()'在默認的清理方法之後調用**。 – SiddharthaRT 2012-11-25 06:55:13