2010-12-22 42 views
2

在我的Django項目中,我構建了一個購物車系統。我想將購物車數據存儲在會話變量中,但我不知道在哪裏初始化它。在哪裏初始化Django會話變量?

我試圖做這樣的事情:

if 'cart' not in request.session: 
    request.session['cart'] = {} 
在自定義的背景處理器

,但背景處理器似乎並沒有修改會話數據。我還會在哪裏放置像這樣的初始化?我不想把它放在我從購物車獲得價值的每個地方。

+0

上下文處理器將只觸發使用RequestContext呈現的模板。你確定你傳遞的是一個RequestContext而不是一個簡單的字典或Context對象嗎?這對我有用。 – 2010-12-22 21:11:27

+0

這使我困惑,因爲是的,我確信我傳遞了一個RequestContext。事實上,上下文處理器中的其他代碼正在運行,但初始化代碼不是。也許我錯過了別的東西。無論如何,其他兩種解決方案都在起作用,所以我會使用其中的一種解決方案。 – davidscolgan 2010-12-22 21:19:02

回答

1

在中間件(顯然,在會話中間件下面)做這件事將確保它始終設置。

5

你可以把它放在一塊custom request middleware,但說實話,我認爲這會在這裏矯枉過正。當您在視圖功能中需要時,初始化購物車可能會更容易。請注意,如果該值尚不存在,則可以使用request.session.get自動獲取默認值。例如:

def my_view(request): 
    cart = request.session.get('cart', {}) 
    # Do stuff with cart 
    request.session['cart'] = cart 
0

爲什麼您需要測試購物車是否在request.session中。爲什麼不這樣做:

cart_value = request.session.get('cart',{}) 

基本上什麼,會做是在「購物車」在會話返回值,如果有在車沒有值,則返回空字典。

0

你的代碼應該工作如同帶有一個context_processor,假設你的視圖總是使用RequestContext。

基於幾年前的Satchmo,我正在爲我的購物車做同樣的事情。 我有一個context_processor,我從會話中找到Cart並將它傳遞給模板。 很多其他會話修改也在那裏完成...

所以..你的代碼應該按原樣工作。它是否在執行?它是否安裝?