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中使用多个&lt;form ..&gt;标签,不如只使用一个&lt;form&gt;标签,并在其下添加所有表单的字段。

模板中的示例

<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为表单中的两个提交按钮呈现不同的模板

带有两个提交按钮的 Django 表单。 . .一个需要字段,一个不需要

python测试开发django-24.表单提交之get请求

Django—Form两种保留用户提交数据的方法

确定在 Django 表单提交中单击了哪个提交按钮