0

我实现了一个购物车,它将项目 ID 存储在会话的列表中。我的添加方法看起来像这样

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 %}

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

有什么建议吗?提前致谢!

4

1 回答 1

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

参考何时保存会话

于 2013-04-12T09:32:38.543 回答