我有一组引用单个模型的特殊形式,我已经定义了一个常见的:
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,为什么会发生这种情况?
我错过了什么吗?提前谢谢
答案 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)