繁体   English   中英

Django:一个用于子类的ModelForm

[英]Django: one ModelForm for subclasses

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

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

但这只是复制粘贴。 想象一下,我有两个以上的班级,将来还会有更多。 我想要一个通用的解决方案。

如何用最少的代码行做到这一点?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM