Django形成了如何创建一个简单的mixin

时间:2015-07-01 10:18:41

标签: django forms mixins django-crispy-forms

我有一组引用单个模型的特殊形式,我已经定义了一个常见的:

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")

然后在我的特殊形式中添加:

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 '),
                ),
            ),
显然一切都很好,在形式中 Meta Mixin模型中的所有字段都可用,但mixin中的 clean()不会被执行,如果我将 def clean()附加到SpecialManForm,为什么会发生这种情况?

我错过了什么吗?提前谢谢

2 个答案:

答案 0 :(得分:1)

您应该更改您的SpecialManForm,以便它首先使用您的mixin。

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

当python正在寻找clean方法时,它将首先检查未实现它的SpecialManForm类。然后它将通过继承层次结构,这意味着首先检查ModelForm(正如您目前所拥有的那样)。它在那里实现,因此它将使用ModelForm中的代码,而不是来自mixin,并执行它。

更改类定义中的顺序意味着它将在ModelForm类之前检查mixin以获取clean方法,并使用您已实现的方法。

按以下顺序检查(您的版本)SpecialManForm - > ModelForm - > myBaseFormMixin,这解释了为什么在将方法添加到SpecialManForm时它的工作原理。

答案 1 :(得分:0)

我已经用继承解决了:

class myBaseFormMixin(forms.ModelForm):  

然后是特殊形式:

class SpecialManForm(myBaseFormMixin)