Mik*_*lad 7 python django inheritance django-forms
我有这个 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.
Run Code Online (Sandbox Code Playgroud)
而这个子 ModelForm:
class UpgradedEvent(Event):
def __init__(self, *args, **kwargs):
super(UpgradedEvent,self).__init__(*args,**kwargs)
class Meta(Event.Meta):
model = UpgradedEvent
Run Code Online (Sandbox Code Playgroud)
UpgradedEvent是Event 模型的孩子,但有一些额外的字段。如何将EventFORM 中的所有设置继承到UpgradedEventFORM 中?
运行上面的代码时,它会呈现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
Run Code Online (Sandbox Code Playgroud)
您可以获取上述字段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']Run Code Online (Sandbox Code Playgroud)
因此,通过使用继承,我们可以__init__通过在super(UpgradedEventForm, self)调用后执行一些额外的操作来为函数添加额外的过程,并且我们可以访问我们父级的属性,并扩展这些属性。
请注意,您最好使用Form后缀命名您的表单,因为现在您的模型与您的表单发生冲突。结果,您Form似乎有一个对Form自身的引用作为模型。通过使用正确的“命名法”,您可以避免很多错误。
创建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
Run Code Online (Sandbox Code Playgroud)