Django form如何创建一个简单的mixin

Django form how to create a simple mixin

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

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,它会起作用,为什么会这样?

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

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

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

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

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

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

我用继承解决了:

class myBaseFormMixin(forms.ModelForm):  

然后是特殊形式:

class SpecialManForm(myBaseFormMixin)