Django表单如何创建简单的mixin

Django表单如何创建简单的mixin,django,forms,mixins,django-crispy-forms,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':

我有一组特殊的表单,它们引用单个模型,我定义了一个通用的:

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 '),
                ),
            ),
一切都很好显然,在表单中,MetaMixin中的模型中的所有字段都可用,但是Mixin中的clean()没有执行,如果我将def clean()附加到SpecialManForm中,它就会工作,为什么会发生这种情况


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

您应该更改您的特殊窗体,以便它首先使用您的mixin

class SpecialManForm(myBaseFormMixin, forms.ModelForm)
    def __init__(self, *args, **kwargs):
        ....
当python寻找clean方法时,它将首先检查SpecialManForm类,该类没有实现。然后它将通过继承继承继承权,这意味着首先检查ModelForm(正如您当前所做的那样)。它是在那里实现的,因此它将使用来自ModelForm的代码,而不是来自mixin的代码,并执行该代码

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


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

我已经解决了继承问题:

class myBaseFormMixin(forms.ModelForm):  
然后是特殊形式:

class SpecialManForm(myBaseFormMixin)

所以你现在有一门额外的课,实际上并不需要。你为什么这么说?只有一个类被用作其他类的基础。。。所以:SpecialManForm->ModelForm->myBaseFormMixin,成为SpecialManForm->myBaseFormMixin你问过如何使用Mixin,这就是我的回答告诉你的方法。他们有效地完成了同样的事情,但我的解决方案使用更少的代码,创建更少的类。感谢您的解释,我认为我应该在文档中搜索更多内容,以了解哪一个是最好的,混合还是继承。祝您有愉快的一天如果您实际上不打算创建myBaseFormMixin的实例,那么Mixin可能更合适。尽管这两种方法非常相似。