2015-12-09 51 views
1

我有一個頁面(對應於詳細信息視圖)顯示項目列表,每個項目都有一個關聯的複選框。頁面上有一個按鈕,當提交時會添加請求。將檢查的項目列表保留,並表示應刪除它們。刪除後,我想重定向回到相同的視圖 - 細節。即使重定向後Django表單重新提交

詳細視圖的前兩行:

def detail(request, inventory_id, category_id=None): 
    check_POST_and_update(request, inventory_id, category_id) 

這裏是check_POST_and_update方法的相關部分。

def check_POST_and_update(request, inventory_id=None, category_id=None): 
    if request.method=='POST' and request.user.is_authenticated(): 
     r = request.POST 

     if r.get('delete_items', None) and r.get('select_item', None): 
     for item_id in r.getlist('select_item'): 
      Item.objects.get(pk=item_id).delete() 
     return redirect('inventory:detail', inventory_id, category_id) 

刪除和重定向似乎工作正常。我選擇了幾個項目,點擊「刪除選定項目」按鈕,返回相同的頁面,所選項目現在從列表中消失。但是,如果在此時刷新頁面,則會顯示「DoesNotExist ...項匹配查詢不存在」。即舊的POST對象正在被重新提交。我可以證實這一點:

<QueryDict: {u'select_item': [u'149'], u'csrfmiddlewaretoken': [u'MASoSxSn2hmwgFKf95WcWjnVa6GYUnPe'], u'delete_items': [u'Delete selected items']}> 

爲什麼會發生這種情況?我認爲重定向方法可以防止這類問題。如何修復代碼以確保在刷新頁面時舊POST對象不會重新提交?

如果我在某處發生了一個愚蠢的錯誤,請提前致謝並誠摯地致歉!

回答

0

您在detail視圖中沒有返回check_POST_and_update的響應,因此視圖將繼續處理並最終返回不同的響應。

通常情況下你會做return check_POST_and_update,但我認爲這不會起作用,因爲我認爲有一些detail視圖沒有顯示。

您可以檢查方法的結果如下返回之前:

def detail(request, inventory_id, category_id=None): 
    response = check_POST_and_update(request, inventory_id, category_id) 
    if response is not None: 
     return response 
    ... 

我不喜歡這種方法,它似乎很哈克。如果您從check_POST_and_update方法返回布爾值,並且在主視圖中生成響應,則代碼可能會更容易理解。

+0

謝謝!你是對的 - 它解決了問題。我現在正在研究重構代碼的方法,以減少「破解」。 – joshinda