2016-02-29 28 views
4

我有一個Django應用程序,它有點像一個網上商店。在應用中,POST是在一個名爲posthandler.py這樣Django,在呈現模板之前執行templatetag

{% load posthandler %} 
{% posthandler %} 

在那種總是加載中的index.html templatetag處理。在此之後,該文件中有這樣的

{% block primary %}{% endblock %} 

主位現在,這主要位顯示一個值,股票,這就有可能在posthandler位進行了調整。意思是,價值可能是陳舊的。這具有人物點擊物品的作用,將其添加到他們的訂單列表中,但是在庫存值正確地反映數據庫中的值之前需要兩次刷新的頁面。

我認爲這是因爲模板標籤被處理的順序,就像這樣;

  1. 用戶點擊按鈕添加通過視圖orderlist
  2. 頁面將重新加載,首先呈現在index.html中的股票價值基於什麼是目前在DB
  3. 的posthandler.py運行,從其減去一個來自股票,所以數據庫現在是最新的。
  4. 頁面顯示錯誤的編號,因爲該值是在調整前從數據庫中檢索的。

我認爲要處理該視圖中的帖子,但我希望同一個處理程序可以在所有不同的頁面上運行,所以看起來似乎沒有辦法。有一個更好的方法嗎?或者,我可以讓主塊在模板標籤之後執行嗎?

回答

2

在模板中處理表單確實是一個設計錯誤。使用middlewares應該適合您的需求。

另一種解決方案是創建一個View mixin,並讓所有視圖繼承該mixin。但使用中間件應該更好。

但是,爲什麼您沒有單個頁面來處理此POST請求,並在表單處理後重定向到準確的頁面?

+0

我沒有這樣一個頁面,因爲我沒有真正想到這一點。我會研究中間件。 – Eloque

+0

擁有專門用於接收和處理此POST請求的單個頁面似乎是要走的路。它會更清晰,更容易,並且會節省檢查請求方法的開銷,並且在它爲POST的情況下,檢查提交的表單是否是您想要處理的表單。 –

+0

我有點想要這個過程是透明的。也許以後甚至沒有重新加載。您建議的中間件解決方案目前工作良好。謝謝。 – Eloque

0

我有這樣的感覺,你在模板標籤中做的事情不應該在那裏完成。我從來沒有讀過關於這方面的限制,但我認爲在概念上,模板標籤應該是無狀態的,而不是修改數據庫內容。

要在視圖中完成所需的工作而沒有邏輯重複,您可以使用基於類的視圖,並從通用Mixin類繼承,在該類中實現數據修改,或使用通用裝飾器修飾它們並實現數據修改在那個裝飾者。

但是,如果修改應該爲全部視圖完成,那麼中間件作爲Antoine suggests可能是要走的路。