【问题标题】:Django How to save same model form twice on one submit requestDjango 如何在一个提交请求上保存相同的模型表单两次
【发布时间】:2014-09-12 13:51:26
【问题描述】:

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

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

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

@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

在这里,从 HTML 接收到的第 75 行和第 76 行的值是不同的。 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 中编辑了函数,如下所示,但我仍然无法在数据库中为同一个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))

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 嗨@knbk 感谢您的及时回复。但是,我无法通过使用前缀标签来解决问题。事实上,现在没有任何东西被提交给数据库。我正在编辑上面的代码,希望您能指出我正确的方向。我不是很清楚如何利用前缀标签来区分我的模型形式。
    • 您好@knbk,您的解决方案有效!不知何故,前缀没有被添加到我的 HTML 输入元素中,但是当我重新启动服务器时一切正常,现在我可以在我的数据库中为同一个模型表单插入两个不同的行。非常感谢你的帮助!真的很感激!
    猜你喜欢
    • 2019-05-31
    • 2017-12-24
    • 2021-12-27
    • 2016-04-02
    • 1970-01-01
    • 2014-11-25
    • 2020-11-03
    • 2013-03-31
    相关资源
    最近更新 更多