首页 > 解决方案 > Django ModelForm 继承和 Meta 继承

问题描述

我有这个 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

UpgradedEventEvent 模型的孩子,但有一些额外的领域。如何将所有设置从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

标签: pythondjangoinheritancedjango-forms

解决方案


您可以获取上述字段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),并且我们可以访问父级的属性,并扩展这些属性。

请注意,您最好使用Form后缀命名您的表单,因为现在您的模型与您的表单发生冲突。结果,您Form的模型似乎具有对Form自身的引用。通过使用正确的“命名法”,您可以避免很多错误。


推荐阅读