如何使用基于 class 的视图在同一模板中使用两个不同的 Django 表单

How to use two different Django Form at the same template using class based view

我正在使用基于 django class 的视图来创建两种形式(线程、消息)。

views.py

class ThreadForm(FormView):
    template_name = 'thread.html'
    form_class = ThreadModelForm
    success_url = '/success'

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        return super(ThreadForm, self).form_valid(form)

class MessageForm(FormView):
    template_name = 'thread.html'
    form_class = MessageModelForm
    success_url = '/success'

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        return super(MessageForm, self).form_valid(form)

两者都是渲染同一个html文件thread.html。谁能告诉我如何在同一个模板中呈现这两种形式?

thread.html

{{ form.as_p }}

更新:我正在使用下面的视图,但它不起作用:

class MessageForm(FormView):
    template_name = 'thread.html'
    success_url = '/success'

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        return super(MessageForm, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(MessageForm, self).get_context_data(**kwargs)
        context['second_form'] = MessageModelForm
        return context

为此使用 get_context_data 方法。

def get_context_data(self, **kwargs):
    context = super(FormViewName, self).get_context_data(**kwargs)
    context['second_form'] = SecondForm
    return context

然后在您的模板中您可以使用

{{ second_form.as_p }}

同样在您的 form_valid 方法中,您还必须检查 second_form 有效性。

我是这样做的...

class SolicitudUpdate(UpdateView):
    model = Solicitud
    second_model = Persona
    template_name = 'adopcion/solicitud_form.html'
    form_class = SolicitudForm
    second_form_class = PersonaForm
    success_url = reverse_lazy('adopcion:solicitud_listar')


    def get_context_data(self, **kwargs):
        context = super(SolicitudUpdate, self).get_context_data(**kwargs)
        pk = self.kwargs.get('pk', 0)
        solicitud = self.model.objects.get(id=pk)
        persona = self.second_model.objects.get(id=solicitud.persona_id)
        if 'form' not in context:
            context['form'] = self.form_class()
        if 'form2' not in context:
            context['form2'] = self.second_form_class(instance=persona)
        context['id'] = pk
        return context