2011-10-25 18 views
1

Temlate:「密鑰 'itemsForRemove' 中未發現<的QueryDict:{}>」

<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> 

引發異常: 「如果我將」removeThis = request.POST ['itemsForRemove']「更改爲」removeThis = request.POST「,則在」 「中找不到」Key'itemsForRemove' ['foo'],引發異常:「Key'foo'not found in」。 u'itemsForRemove':[u'6',u'7']}爲什麼?我該如何解決這個問題?

回答

1

你的問題是,你是通過request.path_info重定向,這只是goint將您重定向回你remove_cart視圖。

您的第一個錯誤的原因是"Key 'itemsForRemove' not found in "是因爲第一次嘗試工作,您的視圖重定向到自己作爲GET,顯然沒有itemsForRemove 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') 
1

如果請求不包含itemsForRemove的值,則會引發異常。更好的方法是使用removeThis = request.POST.get('itemsForRemove', ''),它將默認爲'',即使值不存在也不會引發異常。