Django &引用;键';项目移动';在<;查询信息:{}>&引用;

Django &引用;键';项目移动';在<;查询信息:{}>&引用;,django,Django,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>

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>
浏览器中的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']}为什么?!我怎样才能解决这个问题

如果请求不包括
itemsForRemove
的值,它将引发异常。更好的方法是使用
removeThis=request.POST.get('itemsForRemove','')
,它将提供默认值
'
,即使值不存在,也不会引发异常。

您的问题是您正在通过
请求.path\u info
重定向,这只是将您重定向回您的
remove\u cart
视图

第一个错误是在“中找不到“Key”itemsForRemove“的原因是第一次尝试成功,并且您的视图重定向到自身作为GET,而GET显然没有itemsForRemove POST数据

当您将代码更改为“foo”时,它在您的第一个后期阶段失败(这就是为什么您正确地看到
“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')
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')