Django:使用基于类的视图在一个提交中处理多个表单?

时间:2014-11-13 12:07:39

标签: python django forms inheritance

我正在使用django 1.6,我有一个产品型号,我正在制作一个编辑页面,您可以在其中编辑产品的所有方面。由于产品具有相当多的属性,一些由其他模型(ProductText,ProductPrice,ExtraImage等)表示,我在python端有不同的模型形式代表这些东西,而在模板中我想渲染所有这些形式相同的标签,创建一个大的形式来发布它们。

但是,由于django提供的所有基于类的视图似乎只处理一个表单实例,处理所有这些表单的最佳选择是什么?

我明白我必须继承继承树中的某个地方,但是看看django源代码,视图继承有点复杂,对于mixins等等,所以我不知道什么是最聪明的继承在我的避免重新制造太多轮子的情况。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

<强>网址

url(r'^edit/(?P<model1_pk>\d+)/(?P<model2_pk>\d+)/$', EditBaseForm.as_view(), name='edit'),

查看

class EditBaseForm(TemplateView):
    template_name = 'some_edit.html'

    def dispatch(self, request, *args, **kwargs):
        self.object1 = get_object_or_404(SomeModel1, pk=kwargs.get('model1_pk'))
        self.object2 = get_object_or_404(SomeModel2, pk=kwargs.get('model2_pk'))
        # and so on

        return super(EditBaseForm, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(EditBaseForm, self).get_context_data(**kwargs)
        if not (context.get('form1') and context.get('form2')):  # actually you can check only first of them
            context['form1'] = FormClass1(instance=self.object1)
            context['form2'] = FormClass2(instance=self.object2)

        return context

    def post(self, request, *args, **kwargs):
        form1 = FormClass1(request.POST, request.FILES, instance=self.object1)
        form2 = FormClass2(request.POST, request.FILES, instance=self.object2)

        if form1.is_valid() and form2.is_valid():
            return self.form_valid(form1, form2)
        else:
            return self.form_invalid(form1, form2)

    def form_valid(self, form1, form2):
        form1.save()
        form2.save()

        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form1, form2):
        return self.render_to_response(
            self.get_context_data(
                form1=form1,
                form2=form2,
            )
        )

    def get_success_url(self):
        return reverse('some_app:some_url')

<强>模板

<form method="post">{% csrf_token %}
    {{ form1.as_p }}
    {{ form2.as_p }}

    <input type="submit" value="Submit" />
</form>