Django e-commerce part40 Django Sessions
Djangoのセッションの利用方法
公式ドキュメント:
セッションの使いかた | Django documentation | Django
carts/views.py を編集する。
class CartView(View): cart_id = request.session.get("cart_id") if cart_id == None: cart = Cart() cart.save() cart_id = cart.id # 上記は、Cart.objects.create()と同じ意味。 request.session["cart_id"] = cart_id else: cart = Cart.objects.get(id=cart_id)
- request.session からcart_idのkeyがついたvalueをゲットする。
- cart_idがない場合は、新たにCartのinstance(Cart())を作って、saveする。
- 新しいinstanceのcart.idをcart_idに代入する。
- request.session に、keyをcart_idに指定して、先ほど取得したcart.idを渡す。
- cart_idがある場合は、cart_idから、cartに該当のinstanceを渡す。
carts/view.py をさらに修正する。
class CartView(View): def get(self, request, *args, **kwargs): cart_id = request.session.get("cart_id") if cart_id == None: cart = Cart() cart.save() cart_id = cart.id # 上記は、Cart.objects.create()と同じ意味。 request.session["cart_id"] = cart_id cart = Cart.objects.get(id=cart_id) item_id = request.GET.get("item") delete_item = request.GET.get("delete") if item_id: item_instance = get_object_or_404(Variation, id=item_id) qty = request.GET.get("qty") cart_item = CartItem.objects.get_or_create(cart=cart, item=item_instance)[0] if delete_item: cart_item.delete() else: cart_item.quantity = qty cart_item.save() return HttpResponseRedirect("/")
sessionは、ログイン、ログアウトに関係なく同じのため、ログイン後も同様のデータが保存され、カートには便利。
CartViewにいろいろ機能を追加
- sessionの有効期限を追加(0は、ブラウザが閉じられるまで)
request.session.set_expiry(0)
- ログインuserの場合に、Cartにuser名を入れる
if request.user.is_authenticated(): cart.user = request.user cart.save()
- 最終的にここは以下のようなコードで終了
from django.views.generic import View from django.http import HttpResponseRedirect from django.shortcuts import render, get_object_or_404 # Create your views here. from products.models import Variation from carts.models import Cart, CartItem class CartView(View): def get(self, request, *args, **kwargs): request.session.set_expiry(0) cart_id = request.session.get("cart_id") if cart_id == None: cart = Cart() cart.save() cart_id = cart.id # 上記は、Cart.objects.create()と同じ意味。 request.session["cart_id"] = cart_id cart = Cart.objects.get(id=cart_id) if request.user.is_authenticated(): cart.user = request.user cart.save() item_id = request.GET.get("item") delete_item = request.GET.get("delete") if item_id: item_instance = get_object_or_404(Variation, id=item_id) qty = request.GET.get("qty") cart_item = CartItem.objects.get_or_create(cart=cart, item=item_instance)[0] if delete_item: cart_item.delete() else: cart_item.quantity = qty cart_item.save() return HttpResponseRedirect("/")
注意点
cart()とcartitem()を混同しないように注意!cartitemは、itemとcartをつなぐものなので、userとはまた関係ない。