【问题标题】:How to avoid repeating field list in ModelForm and CreateView class?如何避免在 ModelForm 和 CreateView 类中重复字段列表?
【发布时间】:2015-01-28 12:19:42
【问题描述】:

我正在使用django.forms.ModelFormdjango.views.generic.CreateView 为我的模型创建创建视图。

我发现我最终得到了这个代码:

forms.py:

class ScenarioForm(forms.ModelForm):
    class Meta:
        model = Scenario
        fields = ['scenario_name', 'description',
                  'scenario_file', 'preview']     

views.py:

class ScenarioUpload(generic.CreateView):
    model = Scenario
    fields = ['scenario_name', 'description',
              'scenario_file', 'preview']     
    form_class = ScenarioForm

这似乎是非常糟糕的重复。是不是我做错了什么,或者我可以通过什么方法来避免这种情况?

【问题讨论】:

  • 一种方法是在class OMeta 之外定义一个类,其类属性为modelfields。然后(1)定义class ScenarioForm(forms.ModelForm): class Meta = OMeta和(2)class ScenarioUpload(generic.CreateView, OMeta):

标签: django django-forms django-class-based-views


【解决方案1】:

您可以创建自己的 Meta 类:

class MetaScenario:
    model = Scenario
    fields = ['scenario_name', 'description',
              'scenario_file', 'preview']

class ScenarioForm(forms.ModelForm):
    Meta = MetaScenario

class ScenarioUpload(generic.CreateView, MetaScenario):
    pass

【讨论】:

  • 哇......伟大的思想都一样!大声笑——我在评论中建议了同样的技巧。
  • 但是......我去实现它并且它不起作用:(不幸的是,用 Meta 类父级替换 ScenarioUpload 类的内容会导致“TemplateResponseMixin 需要定义'template_name' 或 'get_template_names()' 的实现”。我看不出有什么东西“知道”差异!
【解决方案2】:

Tony 的回答有正确的想法,但实际上必须编码的方式是使用“新样式”类,在派生类中首先列出 mixin:

class MetaScenario(object):   
    model = Scenario
    fields = ['scenario_name', 'description',
              'scenario_file', 'preview']

class ScenarioForm(forms.ModelForm):
    Meta = MetaScenario

class ScenarioUpload(MetaScenario, generic.CreateView):
    form_class = ScenarioForm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2011-10-16
    • 2014-08-19
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多