Django:基于类的视图form_class选择

时间:2017-10-24 15:22:57

标签: django django-forms django-views

我有一个单独的视图,可以使用或不使用 label_rif 属性调用,基于此我可以切换form_class和模板吗?

class LabelCreateView(CreateView):
    model = models.Label

    if self.kwargs['label_rif'] > 0:
        form_class = LabelForm
        template_name = 'AUTO_form.html'
    else:
        form_class = LabelManForm
        template_name = 'MAN_form.html'

我试图在方法

中插入form_class但没有成功
def get_form_kwargs(self):
    kwargs = super(LabelCreateView, self).get_form_kwargs()

    if self.kwargs['label_rif']:
             form_class = LabelForm

或者我应该定义另一个单独的视图? 我想保持干燥,有可能吗?

1 个答案:

答案 0 :(得分:1)

您可以通过覆盖get_form_classget_template_names在一个视图中执行此操作:

class LabelCreateView(CreateView):
    model = models.Label

    def get_form_class(self):
        if self.kwargs['label_rif'] > 0:
            return LabelForm
        else:
            return LabelManForm

    def get_template_names(self):
        # Note this returns a list, not a string
        if self.kwargs['label_rif'] > 0:
            return ['AUTO_form.html']
        else:
            return ['MAN_form.html']

根据你的url配置,我认为在这种情况下两个视图可能更具可读性。您只需要覆盖不同的属性,因此它仍然是DRY。

class LabelCreateView(CreateView):
    model = models.Label

    form_class = LabelForm
    template_name = 'AUTO_form.html'

class ManLabelCreateView(LabelCreateView):
    form_class = LabelManForm
    template_name = 'MAN_form.html'