33

是否可以在 django 中使用一个提交按钮提交两种不同的表单?我有一种称为“仪器”的形式和 4 种相等的形式“配置”。现在我想总是提交一个配置和仪器。例如instrument + config 1 和instrument + config 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
4

2 回答 2

73

与其<form ..>在html中使用多个标签,不如只使用一个<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")
于 2013-08-28T13:39:38.827 回答
3

扩展@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")

附属表格/模型表格(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")
于 2019-12-22T08:49:01.163 回答