2010-12-22 76 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并将它传递给模板。 很多其他会话修改也在那里完成...

所以..你的代码应该按原样工作。它是否在执行?它是否安装?