簡體   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