Temlate:
<form action="/remove_from_cart/" method="post">{% csrf_token %}
{% for item in request.session.cart %}
<div><input type="checkbox" name="itemsForRemove" value="{{ item.position }}"/>{{ item.product.name }}</div>
{% endfor %}
<p><input type="submit" value="Delete item"></p>
</form>
views.py
def RemoveProductFromCart(request):
removeThis = request.POST['itemsForRemove']
listOfItems = request.session['cart']
for i in removeThis:
del listOfItems[int(removeThis) - 1]
return redirect(request.path_info)
浏览器中的HTML
<form action="/remove_from_cart/" method="post">
<div style="display:none">
<input type="hidden" name="csrfmiddlewaretoken" value="c49716c88a56e8e9884b31a233076b48"/>
</div>
<div>
<input type="checkbox" name="itemsForRemove" value="1"/>
Some text
</div>
<div>
<input type="checkbox" name="itemsForRemove" value="2"/>
Some text
</div>
<div>
<input type="checkbox" name="itemsForRemove" value="3"/>
Some text
</div>
<div>
<input type="checkbox" name="itemsForRemove" value="4"/>
Some text
</div>
<div>
<input type="checkbox" name="itemsForRemove" value="5"/>
Some text
</div>
<p>
<input type="submit" value="Delete item"/>
</p>
</form>
提出异常:“未找到”键'itemsForRemove' 如果我改变“removeThis = request.POST ['itemsForRemove']”对某些人的想法如下:removeThis = request.POST ['foo'],引发异常:“未找到”密钥'foo'。 u'itemsForRemove':[u'6',u'7']}为什么?!我怎么能解决这个问题?
答案 0 :(得分:1)
如果请求中不包含itemsForRemove
的值,则会引发异常。更好的方法是使用removeThis = request.POST.get('itemsForRemove', '')
,默认值为''
,即使值不存在也不会引发异常。
答案 1 :(得分:1)
您的问题是您要通过request.path_info
进行重定向,这只是将您重新定向到remove_cart
视图。
您的第一个错误是"Key 'itemsForRemove' not found in "
的原因是因为第一次尝试有效并且您的视图重定向到自身作为GET,显然没有itemsForRemove POST数据。
当您将代码更改为“foo”时,它在您的第一个POST阶段失败(这就是您正确看到"itemsForRemove"
)的原因。
无论如何,修复重定向问题,然后添加一项检查以确保通过POST调用您的视图。
def RemoveProductFromCart(request):
if not request.method == 'POST':
return http.HttpResponseForbidden()
removeThis = request.POST['itemsForRemove']
listOfItems = request.session['cart']
for i in removeThis:
del listOfItems[int(removeThis) - 1]
return redirect('somewhere_else')