我实现了一个购物车,它将商品ID存储在会话的列表中。我的add方法看起来像这样
def add_to_cart(request):
if request.method == 'POST':
if 'cart' not in request.session:
request.session['cart'] = []
if not request.POST['item-id'] in request.session['cart']:
request.session['cart'].append(request.POST['item-id'])
return HttpResponse('true')
通过在add方法中打印会话,我得到正确数量的元素。但是当重新加载视图时,我尝试读取存储在会话中的列表,我只获得一个包含单个元素的列表。我的观点看起来像这样
def cart(request):
cart_items = request.session['cart']
print len(cart_items)
return render(request, 'checkout/cart.html', ({ 'items': cart_items }))
在模板中我只想打印这样的列表:
{% load cart_helpers %}
{% block content %}
<div class="cart">
<div class="inner">
<h2>Warenkorb</h2>
<table class="listing">
{{ items }}
</table>
</div>
</div>
{% endblock %}
无论我做什么,我的购物车会话中的列表只有一个项目......
任何建议?提前谢谢!
答案 0 :(得分:2)
在您的视图中,您需要设置request.session.modified = True
以指示您已修改会话对象。
因此,请将您的视图更新为
def add_to_cart(request):
if request.method == 'POST':
if 'cart' not in request.session:
request.session['cart'] = []
if not request.POST['item-id'] in request.session['cart']:
request.session['cart'].append(request.POST['item-id'])
request.session.modified = True #set modified state
return HttpResponse('true')
这是必需的,因为
request.session['cart'].append(request.POST['item-id'])
不会修改request.session
但会修改request.session['cart']
,在这种情况下,django不知道修改后的会话并且不保存它。