在<querydict:{} =“”>“</querydict:>中找不到”键'itemsForRemove'

时间:2011-10-25 00:57:08

标签: 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>
{% 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']}为什么?!我怎么能解决这个问题?

2 个答案:

答案 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')