Django如何在一个提交请求上保存两次相同的模型表单

时间:2014-07-21 22:02:26

标签: django django-admin django-views django-forms

我是Django的新手,我试图在我的views.py中保存一次单个模型表单,因为我想在DB中创建两个不同的行。我可以保存表单并在数据库中创建两行,但不幸的是,第二种形式的值会保存在我的两行中。 我想在单击提交按钮一次时为同一模型保存两个不同的行。

我已经完成了帖子 - django submit two different forms with one submit buttonDjango: saving multiple modelforms simultaneously (complex case),但它没有回答我的查询,因为我想要保存两次SAME模型表单。

以下是我保存表单的功能:

@csrf_protect
@login_required
@never_cache  
def testQuotaReq(request):
    form1 = quotaRequestForm(request.POST or None)
    form2 = quotaRequestForm(request.POST or None)

if form1.is_valid() and form2.is_valid():        
    form1.process()
    save1 = form1.save(commit=True)
    save1.save()    

    form2.process()
    save2 = form2.save(commit=True)
    save2.save()

    return HttpResponse("Form1 Form2 saved")
        #else:
        #    return HttpResponse('Thanks for your request! Your request id is: %d .' % (save1.pk) )  
else:
    form1 = quotaRequestForm()
    form2 = quotaRequestForm()

return render_to_response('quotaRequest.html',
                              locals(),
                              context_instance=RequestContext(request))

上面这段代码在表格中创建了以下行(简化为突出显示问题):

Id  Descr   Val CPU RAM     Inst

76  testing 18  180 18432   18  
75  testing 18  180 18432   18  
74  testing 11  110 11264   11  
73  testing 11  110 11264   11

在这里,从第75行和第76行的HTML收到的值是不同的。同样地,73和74.我错过了什么吗?感谢您的帮助!

编辑:

HTML代码:

<form method='POST' action='' id="formSubmit"> {% csrf_token %}

    <div class="form1">
    {{ form1.as_p }}
    </div>

    <div class="form2">  
    {{ form2.as_p }}
    </div>

    <a class="btn btn-info" href="/quotaRequest">Cancel Request</a>
    <button type="submit" class="btn btn-info"><b>Submit Request</b></button>
    </form>

另外,我在views.py中编辑了如下所示的函数,但是我仍然无法在DB中为同一个modelForm添加两个不同的行。我不清楚如何使用前缀标记。帮助赞赏!

@csrf_protect
@login_required
@never_cache  
def testQuotaReq(request):
    form1 = quotaRequestForm(request.POST or None, prefix="form-1")
    form2 = quotaRequestForm(request.POST or None, prefix="form-2")

    if form1.is_valid() and form2.is_valid():        
        form1.process()
        save1 = form1.save(commit=True)
        save1.save()    

        form2.process()
        save2 = form2.save(commit=True)
        save2.save()

        return HttpResponse("Form1 Form2 saved")
#     else:
#         form1 = quotaRequestForm()
#         form2 = quotaRequestForm()
    return render_to_response('quotaRequest.html',locals(), context_instance=RequestContext(request))

1 个答案:

答案 0 :(得分:3)

目前,您的两个表单生成具有相同名称的input个元素,因此最后一个输入的数据将针对这两个表单发布。

您可以指定两个唯一的prefix来区分表单:

form1 = quotaRequestForm(request.POST or None, prefix='form-1')
form2 = quotaRequestForm(request.POST or None, prefix='form-2')

每次实例化表单时都需要指定正确的prefix

顺便说一句,您可能想要删除else子句。目前,如果任一表单无效,则数据将被删除。如果不重置值,表单将显示第一次提交的输入并向用户显示正确的错误消息。