python - 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
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
解决方案
您可以获取上述字段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
自身的引用。通过使用正确的“命名法”,您可以避免很多错误。
推荐阅读
- angular - Firebase 安全规则权限不足
- sql-server - 什么会导致查询扫描索引 900 万次?
- x86-64 - 在 Intel x86-64 架构上是否以 little endian 4 字节字获取机器代码指令?
- postgresql - Postgres:INSERT INTO 使用列上的序列
- python - 我正在尝试使用 python 创建一个随机加载生成器。但是我在使用用户输入重新运行程序时遇到问题
- databricks - 使用 Databricks-connect 时未发现模块错误
- reactjs - 如何在输入更改时将建议值获取到下拉列表,然后使用 React Downshift 的 useCombobox 获取值?
- ruby-on-rails - 未初始化的常量 UsersController 你的意思是?用户控制器
- typescript - Okta 使用 Nuxt.js/Vue 和 OpenId 注销
- c# - 使用带有反射的 ConstructorInfo 调用程序集