我有一个这样的抽象模型:
class BaseAgent(models.Model):
name = models.CharField('Name', max_length=128, null=False, default='')
class Meta:
abstract = True
我正在使用精确的代理类型创建此模型的子类。例如Agent001,Agent002,等等。
我希望每个子类只有一个ModelForm
形式的类。我将把它传递给UpdateView
视图。但它需要指定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
中有一个字符串来调用仅传递模型名称的视图(也是表单)。
url(r'^agent001/new$', login_required(views.AgentCreateUpdateView.as_view(model=Agent001, form=ImprovedAgentForm)), name='new_agent001'),
当然,我可以为每个模型创建一个表单,如下所示:
class Agent001EditForm(AgentEditForm):
class Meta:
model = Agent001
但它只是一个复制粘贴。想象一下,我有两个以上的课程,未来会有更多课程。我想要一个通用的解决方案。
如何用最少的代码行完成?
答案 0 :(得分:1)
<强> 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