我有一个像这样的抽象模型:
class BaseAgent(models.Model):
name = models.CharField('Name', max_length=128, null=False, default='')
class Meta:
abstract = True
我正在使用确切的代理类型创建该模型的子类。例如 Agent001、Agent002 等等。
我希望每个子类都只有一个 ModelForm
表单类。我将把它传递给 UpdateView
View 。但它需要指定Meta.model
。
class AgentEditForm(ImprovedForm, forms.ModelForm):
class Meta:
model = BaseAgent # here I would like to have Agent001, Agent002 or others
exclude = ()
我有一个 ModelForm
的子类,添加了一些 mixin,并且想使用这个类(我们称之为 ImprovedForm
)。
理想情况下,我希望在 urls.py
中有一个字符串来调用仅传递模型名称(以及表单)的 View 。
url(r'^agent001/new$', login_required(views.AgentCreateUpdateView.as_view(model=Agent001, form=ImprovedAgentForm)), name='new_agent001'),
当然,我可以为每个模型创建一个表单,如下所示:
class Agent001EditForm(AgentEditForm):
class Meta:
model = Agent001
但这只是复制粘贴。想象一下,我有两个以上的类(class),并且将来还会有更多类(class)。我想要一个通用的解决方案。
如何用最少的代码行来完成它?
最佳答案
forms.py
import sys
for model in (Agent001, Agent002):
form_name = model.__name__ + 'EditForm'
class AgentEditForm(forms.ModelForm):
class Meta:
model = model
exclude = ()
AgentEditForm.__name__ = form_name
setattr(sys.modules[__name__], form_name , AgentEditForm)
del AgentEditForm
关于python - Django:子类的一个 ModelForm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346154/