我是Django的新手,我试图在我的views.py中保存一次单个模型表单,因为我想在DB中创建两个不同的行。我可以保存表单并在数据库中创建两行,但不幸的是,第二种形式的值会保存在我的两行中。 我想在单击提交按钮一次时为同一模型保存两个不同的行。
我已经完成了帖子 - django submit two different forms with one submit button和Django: 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))
答案 0 :(得分:3)
目前,您的两个表单生成具有相同名称的input
个元素,因此最后一个输入的数据将针对这两个表单发布。
您可以指定两个唯一的prefix
来区分表单:
form1 = quotaRequestForm(request.POST or None, prefix='form-1')
form2 = quotaRequestForm(request.POST or None, prefix='form-2')
每次实例化表单时都需要指定正确的prefix
。
顺便说一句,您可能想要删除else
子句。目前,如果任一表单无效,则数据将被删除。如果不重置值,表单将显示第一次提交的输入并向用户显示正确的错误消息。