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)
我有一组引用单个模型的特殊形式,我定义了一个通用的:
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)