我有一个表单,我希望所有其他表单都从中继承,下面是我尝试过的,但是我得到了一个错误,这表明init不是从AbstractFormBase
类运行的。SchemeForm“should”在运行自己的参数之前继承所有__init__
参数。
错误:
'SchemeForm' object has no attribute 'fields'
代码更新:
class AbstractFormBase(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-lg-3'
self.helper.field_class = 'col-lg-8'
class SchemeForm(AbstractFormBase, NgModelFormMixin,):
def __init__(self, *args, **kwargs):
super(SchemeForm, self).__init__(*args, **kwargs)
self.helper.layout = Layout(
'name',
'domain',
'slug',
)
最佳答案
您的AbstractFormBase
类与继承树中的其他类不合作。您的SchemeForm
类有一个特定的MRO,一个方法解析顺序。super()
调用将仅按该顺序调用next__init__
方法,而AbstractFormBase
是下一个方法(后跟NgModelFormMixin
和forms.ModelForm
)。
您希望通过在__init__
类中使用super()
将AbstractFormBase
调用传递到MRO中的下一个类:
class AbstractFormBase(object):
def __init__(self, *args, **kwargs):
super(AbstractFormBase, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-lg-3'
self.helper.field_class = 'col-lg-8'
注意,这同样适用于
NgModelFormMixin
,form.ModelForm
要求Meta
类具有fields
或exclude
属性(请参见selecting the fields to use)关于python - Django表单继承不起作用__init__,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21042624/