【问题标题】:Django write in database when form is submit提交表单时Django写入数据库
【发布时间】:2017-10-03 12:32:21
【问题描述】:

我希望使用 html 表单能够将信息发送回我的 view.py,目标是获取数据,将其用作调用存储过程的参数。

def mouvementCreation(request):
    idMI = 0
    especes = TbEspece.objects.order_by('id')
    #Get Mouvement informations

    #Connection to 'erp-site' DB 
    cursor = connections['erp-site'].cursor()
    try:
        #Get Produits list from Espece
        query = "{CALL SP_webGET_PRODUIT_FROM_ESPECE(%s,%s,%s,%s,%s)}"
        arguments = (2016, 'C', 0, 10, 'A',)
        cursor.execute(query, arguments)
        produits = dictfetchall(cursor)

        #Get Transporters list
        cursor.execute("{CALL SP_webGET_TRANSPORT}")
        transporters = dictfetchall(cursor)

        #Get Livreur list
        cursor.execute("{CALL SP_webGET_LIVREUR}")
        livreurs = dictfetchall(cursor)
    finally:
        cursor.close()       

    cursor = connections['site'].cursor()
    try:
        #Get Circuit list
        cursor.execute("{CALL SP_webGET_CIRCUIT_FOR_MVT}")
        circuits = dictfetchall(cursor)

        #Get Source list
        cursor.execute("{CALL SP_webGET_SOURCE_FOR_MVT}")
        mvtsources = dictfetchall(cursor)

        #Get Dest list
        cursor.execute("{CALL SP_webGET_DEST_FOR_MVT}")
        destinations = dictfetchall(cursor)

        #Get PontBascule list
        cursor.execute("{CALL SP_webGET_PBASCULE}")
        pontBascules = dictfetchall(cursor)
    finally:
        cursor.close()

    reg_normes = TbRegauxnormes.objects.all()
    ordreexecs = TbOrdreexecution.objects.all()
    form = mouvementForm(request.POST or None)
    if form.is_valid():
        pont = form.cleaned_data['pont']
        dateheure = form.cleaned_data['dateheure']
        poid = form.cleaned_data['poid']
        dsd = form.cleaned_data['dsd']
        typepesee = form.cleaned_data['typepesee']
        #Connection to 'erp-site' DB 
        cursor = connections['pontbascule'].cursor()
        try:
            #Get Produits list from Espece
            query = "{CALL SP_ADD_MANUAL_PESEE(%s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s)}"
            arguments = (pont, '11', dateheure, poid, dsd,typepesee, '','','','','','','','','','','','','','','','')
            cursor.execute(query, arguments)
        finally:
            cursor.close()  
    return render(request, 'mouvementCreation.html', {'form': form, 'especes' : especes, 'produits' : produits, 'transporters' :  transporters, 'livreurs' : livreurs, 'circuits' : circuits, 'mvtsources' : mvtsources, 'destinations' : destinations, 'pontBascules' : pontBascules} )

存储过程应该创建一个新条目。 我想做什么,但我不确定是否可能:

填写表单 => 在视图中检索数据 => 使用检索到的数据调用存储过程 => 获取新条目的 ID,以便用户可以重定向到另一个视图,该视图采用 url 参数中的 id。

这样可以吗?

编辑:我设法让发布请求和我的存储过程一样工作,我现在的问题是最后一部分,在提交表单后将用户重定向到正确的页面。

当前页面是 /gestion_mouvement/mouvementCreation,我希望将用户重定向到 /gestion_mouvement/mouvementDetails/{{ID}}

问题是查询似乎太慢了,因为当我提交表单时,用户被重定向到 /gestion_mouvement/mouvementDetails/ 并且没有收到 ID。

【问题讨论】:

    标签: python sql django forms


    【解决方案1】:

    创建一个新的游标来获取你最后创建的 id 怎么样?

    cursor.execute("SELECT max(id) from MANUAL_PESEE")
    return {rec[0] for rec in cursor}
    

    【讨论】:

    • 谢谢,我的存储过程已经解决了向我发送最后一个 id 的那部分问题,我的问题是,当我提交表单时,我收到一个错误,说他找不到“localhost:8080/gestion_mouvement/mouvementDetails”因为在表单中我输入了“localhost:8080/gestion_mouvement/mouvementDetails{{idCreated}}”,但我认为发布请求重定向比我的查询执行速度更快,所以它最终成为一个没有 id 的 url 并且无法到达页面.
    • 好的,我明白了。你在你的 url 声明中使用了 reverse_lasy 吗? “当您需要在加载项目的 URLConf 之前使用 URL 反转时,它很有用django doc
    • 我没有,我只是检查了文档,但我真的不知道它在我的情况下如何工作,是否可以让页面在重新加载页面之前接收 ID ?因为我在提交表单之前不知道 ID
    【解决方案2】:

    我最近遇到了同样的问题。这就是我所做的。 在插入后(在form.save()之后)查询相关对象模型并获取生成的max(id)

    form.save()
    #mynewid = Msg.objects.all().order_by("-id")[0].id
    mynewid = Msg.objects.latest('id').id
    return redirect('/msg/{0}/edit/'.format(mynewid))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2016-07-23
      相关资源
      最近更新 更多