代码之家  ›  专栏  ›  技术社区  ›  Mike Vlad

Django模型形式继承和元继承

  •  8
  • Mike Vlad  · 技术社区  · 6 年前

    我有这个模型:

    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.
    

    这个子模型:

    class UpgradedEvent(Event):
    
        def __init__(self, *args, **kwargs):
            super(UpgradedEvent,self).__init__(*args,**kwargs)
    
        class Meta(Event.Meta):
            model = UpgradedEvent
    

    UpgradedEvent 他是个孩子 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
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Sardorbek Imomaliev    6 年前

    你可以在 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) 调用,wwe可以访问父级的属性,并扩展这些属性。

    请注意,您最好使用 Form 后缀,因为现在你的模型和你的表格冲突了。因此,你的 类型 似乎有一个参考模型 类型 它本身“正确使用” 命名法 “,你避免了很多错误。

        2
  •  2
  •   willeM_ Van Onsem    6 年前

    创造 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