我有这个ModelForm:
class Event(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(Event, self).__init__(*args, **kwargs)
##Here make some changes such as:
self.helper = FormHelper()
self.helper.form_method = 'POST'
##Many settings here which **i don't want to rewrite in 10 child classes**
class Meta:
model = Event
exclude = something...
widgets = some settings here also.
这个孩子ModelForm:
class UpgradedEvent(Event):
def __init__(self, *args, **kwargs):
super(UpgradedEvent,self).__init__(*args,**kwargs)
class Meta(Event.Meta):
model = UpgradedEvent
UpgradedEvent
是Event
模型的孩子,但有一些额外的字段。
如何将Event
FORM中的所有设置继承到UpgradedEvent
FORM?
运行上面的代码时,它会呈现Event
表单。有没有办法只继承__init__
内的设置?
修改
检查答案,效果很好但请记住:
你需要在你的子类中创建另一个FormHelper
实例,否则它将无法工作。所以子类应该看起来像:
class UpgradedEvent(Event):
def __init__(self, *args, **kwargs):
super(UpgradedEvent,self).__init__(*args,**kwargs)
self.helper = FormHelper()
class Meta(Event.Meta):
model = UpgradedEvent
答案 0 :(得分:2)
创建FormWithSettings
,它将为您创建表格的常用设置并继承它
class FormWithSettings(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(FormWithSettings, self).__init__(*args, **kwargs)
##Here make some changes such as:
self.helper = FormHelper()
self.helper.form_method = 'POST'
##Many settings here which **i don't want to rewrite in 10 child classes**
class Meta:
exclude = something...
widgets = some settings here also.
class EventForm(FormWithSettings):
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args,**kwargs)
class Meta(FormWithSettings.Meta):
model = Event
class UpgradedEventForm(FormWithSettings):
def __init__(self, *args, **kwargs):
super(UpgradedEventForm, self).__init__(*args,**kwargs)
class Meta(FormWithSettings.Meta):
model = UpgradedEvent
答案 1 :(得分:2)
您可以获取上面的Meta
字段,并扩展列表等:
class UpgradedEventForm(EventForm):
def __init__(self, *args, **kwargs):
super(UpgradedEventForm,self).__init__(*args,**kwargs)
# some extra settings
# ...
# for example
self.fields['extra_field'].initial = 'initial value of extra field'
class Meta(EventForm.Meta):
model = UpgradedEvent
exclude = EventForm.Meta.exclude + ['extra_exclude1', 'extra_exclude2']
fields = EventForm.Meta.fields + ['extra_field']
因此,通过使用继承,我们可以通过在__init__
调用之后执行一些额外操作来向super(UpgradedEventForm, self)
函数添加额外的过程,并且我们可以访问父项的属性,并扩展它们。 / p>
请注意,您最好使用Form
后缀为表单命名,因为现在您的模型会与您的表单冲突。因此,您的Form
似乎具有Form
本身的模型作为模型。通过使用适当的“命名法”,可以避免很多错误。