django 使用一个提交按钮提交两种不同的表单
Posted
技术标签:
【中文标题】django 使用一个提交按钮提交两种不同的表单【英文标题】:django submit two different forms with one submit button 【发布时间】:2013-08-31 14:45:12 【问题描述】:是否可以在 django 中使用一个提交按钮提交两种不同的表单? 我有一种称为“仪器”的形式和 4 种相等的形式“配置”。现在我想总是提交一个配置和仪器。例如仪器 + 配置 1 和仪器 + 配置 2。每个配置都有自己的提交按钮。
我已经用配置表单中的一个按钮进行了尝试:
<input onclick="submitForms()" class="btn btn-primary cfg" type="submit" value="Start" >
并调用一个js函数'onclick':
submitForms = function()
console.log('ok'); //only for testing
document.forms["firstForm"].submit();
document.forms["secondForm"].submit();
这是我在views.py中的方法:
if request.method == 'POST':
form1 = dataproviderInstrumentForm(request.POST)
form2 = dynamicTimeseriesForm(request.POST)
print(request.POST)
if form1.is_valid() or form2.is_valid():
# do some stuff
else:
form1 = dataproviderInstrumentForm() # an unbound form
form2 = dynamicTimeseriesForm() # an unbound form
【问题讨论】:
How do I submit multiple forms with a single submit button in django? 的可能重复项 是的,我看过这篇文章,但是如果没有仅使用 js 函数的表单集就不可能做到这一点? 【参考方案1】:扩展 @Rohan 答案并增加对表单的控制。
不依赖表格/无关系/保存多个表格中的任何表格
单独检查每个表格以检查哪个表格无效。如果包含错误,则将它们存储到上下文中或重定向它们。
if request.method == 'POST':
form1 = Form1( request.POST,prefix="form1")
form2 = Form2( request.POST,prefix="form2")
if form1.is_valid():
# save them
# context['form1_message'] = 'Form1 saved'
else:
#save them into context
context['form1']= form1
if form2.is_valid():
# save them
# context['form2_message'] = 'Form2 saved'
else:
#save them into context
context['form2']= form2
if form1.is_valid() and form2.is_valid():
#that's mean both form is valid and saved successfully
return redirect('page')
else:
return render('/page', context)
else:
form1 = Form1(prefix="form1")
form2 = Form2(prefix="form2")
依赖形式/Modelform(1-1,1-m)/关系形式
一个父表单和一个依赖于父表单的子表单。如果两个表单同时保存或检查错误,那么我们将使用此方法。
if request.method == 'POST':
form1 = Form1( request.POST,prefix="form1")
form2 = Form2( request.POST,prefix="form2")
if not form1.is_valid():
#save them into context
context['form1']= form1
if not form2.is_valid():
#save them into context
context['form2']= form2
if form1.is_valid() and form2.is_valid():
#that's mean both form is valid and saved successfully
return redirect('page')
else:
return render('/page', context)
else:
form1 = Form1(prefix="form1")
form2 = Form2(prefix="form2")
【讨论】:
【参考方案2】:与其在html中使用多个<form ..>
标签,不如只使用一个<form>
标签,并在其下添加所有表单的字段。
模板中的示例
<form >
form1.as_p
form2.as_p
form3.as_p
</form>
因此,当用户提交表单时,您将在视图中看到所有表单数据,然后您可以在视图中执行您正在执行的操作。作为
if request.method == 'POST':
form1 = Form1(request.POST)
form2 = Form2(request.POST)
print(request.POST)
if form1.is_valid() or form2.is_valid():
在这种情况下最好使用form prefix
。
所以你可以这样做
if request.method == 'POST':
form1 = Form1( request.POST,prefix="form1")
form2 = Form2( request.POST,prefix="form2")
print(request.POST)
if form1.is_valid() or form2.is_valid():
else:
form1 = Form1(prefix="form1")
form2 = Form2(prefix="form2")
【讨论】:
如果我一次提交所有表单,这看起来不错,但我想同时提交一个配置表单和仪器表单。所以如果我用他自己的提交按钮提交第二个配置表单,仪器表单也应该提交。其他 3 个配置的提交按钮也应该这样做。始终提交我单击的提交按钮的配置表单和仪器表单。 如果我的表单提交到不同的代码段,然后再次聚集到单个视图中怎么办?以上是关于django 使用一个提交按钮提交两种不同的表单的主要内容,如果未能解决你的问题,请参考以下文章
Django request.POST 不包含提交表单的按钮的名称
带有两个提交按钮的 Django 表单。 . .一个需要字段,一个不需要