Django:子类

时间:2015-12-17 23:24:18

标签: python django

我有一个这样的抽象模型:

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

但它只是一个复制粘贴。想象一下,我有两个以上的课程,未来会有更多课程。我想要一个通用的解决方案。

如何用最少的代码行完成?

1 个答案:

答案 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