当前位置: 首页 > 面试题库 >

Django:基于类的视图可以一次接受两种形式吗?

范浩荡
2023-03-14
问题内容

如果我有两种形式:

class ContactForm(forms.Form):
    name = forms.CharField()
    message = forms.CharField(widget=forms.Textarea)

class SocialForm(forms.Form):
    name = forms.CharField()
    message = forms.CharField(widget=forms.Textarea)

并想使用基于类的视图,并将两种形式都发送到模板,那有可能吗?

class TestView(FormView):
    template_name = 'contact.html'
    form_class = ContactForm

看来FormView一次只能接受一种形式。尽管在基于函数的视图中,我可以轻松地将两个表单发送到模板,然后在request.POST中检索这两个表单的内容。

variables = {'contact_form':contact_form, 'social_form':social_form }
return render(request, 'discussion.html', variables)

这是使用基于类的视图(通用视图)的限制吗?


问题答案:

默认情况下,基于类的视图每个视图仅支持一个表单。但是还有其他方法可以满足您的需求。但是同样,这不能同时处理两种形式。这也适用于大多数基于类的视图以及常规形式。

views.py

class MyClassView(UpdateView):

template_name = 'page.html'
form_class = myform1
second_form_class = myform2
success_url = '/'

def get_context_data(self, **kwargs):
    context = super(MyClassView, self).get_context_data(**kwargs)
    if 'form' not in context:
        context['form'] = self.form_class(request=self.request)
    if 'form2' not in context:
        context['form2'] = self.second_form_class(request=self.request)
    return context

def get_object(self):
    return get_object_or_404(Model, pk=self.request.session['value_here'])

def form_invalid(self, **kwargs):
    return self.render_to_response(self.get_context_data(**kwargs))

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    if 'form' in request.POST:
        form_class = self.get_form_class()
        form_name = 'form'
    else:
        form_class = self.second_form_class
        form_name = 'form2'

    form = self.get_form(form_class)

    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(**{form_name: form})

模板

{% csrf_token %} .........
{% csrf_token %} .........


 类似资料:
  • 问题内容: 我想制作这种形式的通用类: 问题是,我希望T可以是整数或Long,但不能接受Double。因此,仅有的两个可接受的声明将是: 有什么办法吗? 问题答案: 答案是不。至少没有办法使用泛型类型做到这一点。我建议结合使用泛型和工厂方法来执行您想要的操作。 这样可以确保只能创建和实例。尽管您仍然可以声明类型的变量,但它必须为null。

  • 问题内容: 我有以下型号: 我知道这是可能的: 然后通过标准视图进行处理。 现在我在想,是否有一种方法可以使用基于类的视图(而不是用于管理界面)来实现相同的目的(意思是:使用内联代码来添加/编辑属于账单的项目)。 问题答案: 关键点是: 产生内小号使用: 在的类中返回: 用于保存表单和表单集:

  • 问题内容: 我正在寻找有关其他人如何设计此方法的意见。我将提供基于类(Django组)的视图。 例如,用户组将确定他或她将有权访问哪些视图/模板。我正在考虑也许在表中存储用于查看功能的路径,以确定用户的链接栏将由什么组成。过滤器规范也可以存储,以确定哪些行将填充这些模板。 医院护理单位就是一个很好的例子。一个单位的护士不必看整个医院的病人。他们只需要去看病人。同一部门的医生也只需要看望那些患者,但

  • 问题内容: 主视图是一个简单的分页ListView,我想向其中添加搜索表单。 我认为这样可以解决问题: 但是显然我错了..我在官方文档中找不到该怎么做的方法。 建议? 问题答案: 这些答案对引导我朝正确的方向大有帮助。谢谢大家 对于我的实现,我需要一个窗体视图,该窗体视图同时在get和post上返回ListView。我不喜欢重复get函数的内容,但需要进行一些更改。现在,self.form也可以从

  • 我在实践中读到了一致性。现在我想了解如何处理InterruptedException 来自书籍的建议: -传播异常(可能在特定于任务的清理之后),使您的方法也成为可中断的阻塞方法;或者,恢复中断状态,以便调用堆栈中更高级别的代码可以处理它 -只有实现线程中断策略的代码才能吞咽中断请求。通用任务和库代码绝不应吞没中断请求。 前两种说法我很清楚,但第三种我不明白。你能澄清一下吗?最好提供示例。 吞下中

  • 前言 欢迎来到系列教程的第六部分!在这篇教程中,我们将详细探讨基于类的视图(简称CBV)。我们也将重构一些现有的视图,以便利用内置的基于类的通用视图(Generic Class-Based Views)。 这篇教程我们还将讨论许多其他主题,例如如何使用分页,如何使用markdown以及如何添加简单的编辑器。我们还将探索一个名为 Humanize 的内置软件包,用于对数据进行“人为操作”。 好了,伙