Django模型形式继承和元继承

2024-09-29 06:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个模型:

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.

这个子模型:

^{pr2}$

UpgradedEventEvent模型的子级,但是有一些额外的字段。 如何将Event窗体中的所有设置继承到UpgradedEvent窗体中?在

当运行上述代码时,它呈现Event表单。有没有办法只继承__init__中的设置?在

EDIT

看看答案,它很有用,但请记住: 您需要在子类中创建FormHelper的另一个实例,否则它将无法工作。所以儿童班应该看起来像:

class UpgradedEvent(Event):

    def __init__(self, *args, **kwargs):
        super(UpgradedEvent,self).__init__(*args,**kwargs)
        self.helper = FormHelper()

    class Meta(Event.Meta):
        model = UpgradedEvent

Tags: 模型selfhelpereventsettingsinitdefargs
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

您可以获得上面的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']

因此,通过使用继承,我们可以通过在super(UpgradedEventForm, self)调用之后执行一些额外的操作,向__init__函数添加额外的过程,wwe可以访问父级的属性,并扩展这些属性。在

注意,最好用Form后缀命名表单,因为现在模型与表单冲突。因此,您的Form似乎有一个对Form本身的引用作为模型。通过使用正确的“命名法”,可以避免很多错误。在

相关问题 更多 >