Django 视图中 POST 请求中的多个值不起作用
Multiple values in POST requests in django view not working
我有三个不同的按钮用于不同的目的(从 table 中插入和删除),每个按钮应该处理 POST 中的不同值。我设法用
做到了一次
if request.method == 'POST' 和 request.POST.get("name_of_button", "") == 'value_of_button'
但是当我对不同的按钮再次使用相同的想法时,它就不起作用了。每个条件中的代码都可以正常工作,只是在我添加第二个条件时没有进入 if。
views.py
def listpolls(request):
#mysql connection here#
form = AddPollForm()
form_del = DelPollForm()
if request.method == 'POST' and request.POST.get("btn_add_name", "") == 'btn_add_val':
form = AddPollForm(request.POST)
form_del = DelPollForm(request.POST)
if form.is_valid():
ip = form.cleaned_data['poll_ip']
#poll_time = form.... etc
#whatever you want to do here#
return HttpResponseRedirect('listpolls.html')
else:
return render_to_response("listpolls.html",{"buffer_data": b, 'form': form, 'form_del': form_del} )
elif request.method == 'POST':
#whatever you want to do here#
return HttpResponseRedirect('listpolls.html')
elif request.method == 'POST' and request.POST.get("btn_delbyip_name", "") == 'btn_delbyip_val':
#whatever you want to do here#
return HttpResponseRedirect('listpolls.html')
else:
return HttpResponseRedirect('listpolls.html')
else:
return render_to_response("listpolls.html",{"buffer_data": b, 'form': form, 'form_del': form_del} )
模板
<form action="/services/listpolls/" method="post">{% csrf_token %}
{{ form }}
<button type="submit" value="btn_add_val" name="btn_add_name">Añadir</button>
</form>
<form action="/services/listpolls/" method="post">{% csrf_token %}
{{ form_del }}
<button type="submit" value="btn_delbyip_val" name="btn_delbyip_name">Borrar por IP</button>
</form>
<form action="/services/listpolls/" method="post">{% csrf_token %}
<button type="submit" value="{{b.id}}" name="btn_borrar" class="delete_poll">Borrar</button>
</form>
这是一个简单的逻辑错误。每一个动作是 POST 但按钮不是 "btn_add_val" 的情况都会被第一个 elif 捕获。如果你想抓住 "btn_delbyip_name" 你应该把它移到那个 elif 之前。
删除所有不相关的代码后,您的 'if' 逻辑结构如下:
def listpolls(request):
if request.method == 'POST' and request.POST.get("btn_add_name", "") == 'btn_add_val':
pass
elif request.method == 'POST':
pass
elif request.method == 'POST' and request.POST.get("btn_delbyip_name", "") == 'btn_delbyip_val':
pass
else:
pass
解释该结构:
首先 if 将检查请求是否为 POST 以及某些 POST 参数是否具有所需的值。如果是,它将计算一些东西并留下整个结构。如果没有,则继续下一个elif。
第二个将检查请求是否为 POST。如果是,它将计算一些东西并留下整个结构。如果没有,则继续下一个elif。
第三个将检查请求是否为 POST 以及某些 POST 参数是否具有所需的值。如果是,它将计算一些东西并留下整个结构。如果没有,它将继续。
Else 会计算一些东西并保留 if 的结构。
现在我们可以清楚地看到这里发生了什么,如果第一个条件不为真,而这是 post 请求,第二个条件将永远为真!所以第三个条件甚至不会被检查。您应该简单地交换第二个和第三个条件(附有整个代码)并且它会起作用。
我有三个不同的按钮用于不同的目的(从 table 中插入和删除),每个按钮应该处理 POST 中的不同值。我设法用
做到了一次if request.method == 'POST' 和 request.POST.get("name_of_button", "") == 'value_of_button'
但是当我对不同的按钮再次使用相同的想法时,它就不起作用了。每个条件中的代码都可以正常工作,只是在我添加第二个条件时没有进入 if。
views.py
def listpolls(request):
#mysql connection here#
form = AddPollForm()
form_del = DelPollForm()
if request.method == 'POST' and request.POST.get("btn_add_name", "") == 'btn_add_val':
form = AddPollForm(request.POST)
form_del = DelPollForm(request.POST)
if form.is_valid():
ip = form.cleaned_data['poll_ip']
#poll_time = form.... etc
#whatever you want to do here#
return HttpResponseRedirect('listpolls.html')
else:
return render_to_response("listpolls.html",{"buffer_data": b, 'form': form, 'form_del': form_del} )
elif request.method == 'POST':
#whatever you want to do here#
return HttpResponseRedirect('listpolls.html')
elif request.method == 'POST' and request.POST.get("btn_delbyip_name", "") == 'btn_delbyip_val':
#whatever you want to do here#
return HttpResponseRedirect('listpolls.html')
else:
return HttpResponseRedirect('listpolls.html')
else:
return render_to_response("listpolls.html",{"buffer_data": b, 'form': form, 'form_del': form_del} )
模板
<form action="/services/listpolls/" method="post">{% csrf_token %}
{{ form }}
<button type="submit" value="btn_add_val" name="btn_add_name">Añadir</button>
</form>
<form action="/services/listpolls/" method="post">{% csrf_token %}
{{ form_del }}
<button type="submit" value="btn_delbyip_val" name="btn_delbyip_name">Borrar por IP</button>
</form>
<form action="/services/listpolls/" method="post">{% csrf_token %}
<button type="submit" value="{{b.id}}" name="btn_borrar" class="delete_poll">Borrar</button>
</form>
这是一个简单的逻辑错误。每一个动作是 POST 但按钮不是 "btn_add_val" 的情况都会被第一个 elif 捕获。如果你想抓住 "btn_delbyip_name" 你应该把它移到那个 elif 之前。
删除所有不相关的代码后,您的 'if' 逻辑结构如下:
def listpolls(request):
if request.method == 'POST' and request.POST.get("btn_add_name", "") == 'btn_add_val':
pass
elif request.method == 'POST':
pass
elif request.method == 'POST' and request.POST.get("btn_delbyip_name", "") == 'btn_delbyip_val':
pass
else:
pass
解释该结构: 首先 if 将检查请求是否为 POST 以及某些 POST 参数是否具有所需的值。如果是,它将计算一些东西并留下整个结构。如果没有,则继续下一个elif。
第二个将检查请求是否为 POST。如果是,它将计算一些东西并留下整个结构。如果没有,则继续下一个elif。
第三个将检查请求是否为 POST 以及某些 POST 参数是否具有所需的值。如果是,它将计算一些东西并留下整个结构。如果没有,它将继续。
Else 会计算一些东西并保留 if 的结构。
现在我们可以清楚地看到这里发生了什么,如果第一个条件不为真,而这是 post 请求,第二个条件将永远为真!所以第三个条件甚至不会被检查。您应该简单地交换第二个和第三个条件(附有整个代码)并且它会起作用。