2015-07-01 23 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时起作用。