0

セッションのリストにアイテム 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 メソッドでセッションを出力すると、正しい数の要素が得られます。しかし、ビューをリロードすると、セッションに保存されているリストを読み込もうとすると、1 つの要素を含むリストしか取得できません。私の見解はこのように見えます

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つしかありません...

何かアドバイス?前もって感謝します!

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 に答える