Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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 をさらに修正する。

  • cart = Cart.objects.first() を削除する(すでに上記で、cart_idからcartCartのinstanceはゲットしているため)

  • また、cartのelseも削除する。

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とはまた関係ない。