在我的Django项目中,我构建了一个购物车系统。我想将购物车数据存储在会话变量中,但我不知道在哪里初始化它。在哪里初始化Django会话变量?
我试图做这样的事情:
if 'cart' not in request.session:
request.session['cart'] = {}
在自定义的背景处理器
,但背景处理器似乎并没有修改会话数据。我还会在哪里放置像这样的初始化?我不想把它放在我从购物车获得价值的每个地方。
在我的Django项目中,我构建了一个购物车系统。我想将购物车数据存储在会话变量中,但我不知道在哪里初始化它。在哪里初始化Django会话变量?
我试图做这样的事情:
if 'cart' not in request.session:
request.session['cart'] = {}
在自定义的背景处理器
,但背景处理器似乎并没有修改会话数据。我还会在哪里放置像这样的初始化?我不想把它放在我从购物车获得价值的每个地方。
在中间件(显然,在会话中间件下面)做这件事将确保它始终设置。
你可以把它放在一块custom request middleware,但说实话,我认为这会在这里矫枉过正。当您在视图功能中需要时,初始化购物车可能会更容易。请注意,如果该值尚不存在,则可以使用request.session.get
自动获取默认值。例如:
def my_view(request):
cart = request.session.get('cart', {})
# Do stuff with cart
request.session['cart'] = cart
为什么您需要测试购物车是否在request.session中。为什么不这样做:
cart_value = request.session.get('cart',{})
基本上什么,会做是在“购物车”在会话返回值,如果有在车没有值,则返回空字典。
你的代码应该工作如同带有一个context_processor,假设你的视图总是使用RequestContext。
基于几年前的Satchmo,我正在为我的购物车做同样的事情。 我有一个context_processor,我从会话中找到Cart并将它传递给模板。 很多其他会话修改也在那里完成...
所以..你的代码应该按原样工作。它是否在执行?它是否安装?
上下文处理器将只触发使用RequestContext呈现的模板。你确定你传递的是一个RequestContext而不是一个简单的字典或Context对象吗?这对我有用。 – 2010-12-22 21:11:27
这使我困惑,因为是的,我确信我传递了一个RequestContext。事实上,上下文处理器中的其他代码正在运行,但初始化代码不是。也许我错过了别的东西。无论如何,其他两种解决方案都在起作用,所以我会使用其中的一种解决方案。 – davidscolgan 2010-12-22 21:19:02