会话未在模板中更新?

时间:2013-04-12 09:26:07

标签: django session

我实现了一个购物车,它将商品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 %}

无论我做什么,我的购物车会话中的列表只有一个项目......

任何建议?提前谢谢!

1 个答案:

答案 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不知道修改后的会话并且不保存它。

参考When sessions are saved