2015-07-01 74 views
1

我有一組是指一個單一的模式特殊形式,我已經定義了一個共同的:Django表單如何創建一個簡單的混入

class myBaseFormMixin(forms.Form):  
    data_prod = forms.DateField(initial=datetime.date.today, label='Data') 

    class Meta: 
    model = mymodel 

    def clean(self): 
     if self.data["a"]=='off': 
      raise forms.ValidationError("check A") 

然後在我的specialform補充說:

class SpecialManForm(forms.ModelForm,myBaseFormMixin) 
def __init__(self, *args, **kwargs): 
     super(SpecialManForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(

      Fieldset(
       'Description', 
       Row(
       Div('field_a', css_class='large-3 columns '), 
       ), 
      ), 

一切似乎很好,在形式從模型中密新的所有字段都可以,但乾淨()從混入不執行,如果我追加DEF C工件精益() SpecialManForm,爲什麼發生這種情況?

我錯過了什麼嗎?在此先感謝

回答

0

我已經解決了繼承:

class myBaseFormMixin(forms.ModelForm): 

那麼特殊形式:

class SpecialManForm(myBaseFormMixin) 
+0

所以你實際上沒有現在需要一個額外的類。 –

+0

你爲什麼這麼說?只有一個類被用作其他人的基礎...所以:SpecialManForm - > ModelForm - > myBaseFormMixin,成爲SpecialManForm - > myBaseFormMixin – user2239318

+0

你確實問過如何使用mixins,這就是我的答案告訴你如何去做的。他們有效地完成了同樣的事情,但我的解決方案使用較少的代碼並創建較少的類。 –

1

您應該更改您的SpecialManForm,以便它首先使用您的mixin。

class SpecialManForm(myBaseFormMixin, forms.ModelForm) 
    def __init__(self, *args, **kwargs): 
     .... 

當python正在尋找乾淨的方法時,它將首先檢查SpecialManForm類,它沒有實現。然後它將通過繼承heirarchy,這意味着首先檢查ModelForm(就像你現在有的那樣)。它在那裏實現,所以它將使用ModelForm中的代碼,而不是來自你的mixin,並執行它。

更改類定義中的順序意味着它將在CleanForm的ModelForm類之前檢查您的mixin,並使用您已實現的方法。

它按以下順序檢查(您的版本)SpecialManForm - > ModelForm - > myBaseFormMixin,並解釋了爲什麼它在將該方法添加到SpecialManForm時起作用。