読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

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

Django e-commerce part41 Render Cart View

CartViewをrenderする

SingleObjectMixin をimportする

公式ドキュメント:

Single object mixins | Django documentation | Django

Provides a mechanism for looking up an object associated with the current HTTP request.

つまり、サイトを開いている時点でのHTTP requestに紐付いたobjectを見つけてくる動作(class based viewには多分自動で組み込まれているが、今回はclassbasedviewを使ってないぽいので、viewmixinをわざわざ継承して利用している。)

carts/views.pyを編集

  • 全体としては、get_objectメソッドとgetメソッドを上書きするコードを書く。get_objectは、singleobjectMixinのメソッド。

  • self = CartView() つまり、Cartviewのinstance。

  • def get の、cart = self.get_object() で、sessionからゲットしたcartになっている。
class CartView(SingleObjectMixin, View):
    model = Cart

    def get_object(self, *args, **kwargs):
        self.request.session.set_expiry(0)
        cart_id = self.request.session.get("cart_id")
        if cart_id == None:
            cart = Cart()
            cart.save()
            cart_id = cart.id
            # 上記は、Cart.objects.create()と同じ意味。
            self.request.session["cart_id"] = cart_id
        cart = Cart.objects.get(id=cart_id)

        if self.request.user.is_authenticated():
            cart.user = self.request.user
            cart.save()
        return cart

    def get(self, request, *args, **kwargs):
        cart  = self.get_object()
        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("/")

renderするための準備をする。

  • 今回あh、class based viewではないっぽいので、renderで、context,template_name などを渡す必要あり。
class CartView(SingleObjectMixin, View):
    model = Cart
    template_name = "carts/view.html"

    #こっちは、singleObjectMixinのメソッド
    def get_object(self, *args, **kwargs):
        self.request.session.set_expiry(0)
        cart_id = self.request.session.get("cart_id")
        if cart_id == None:
            cart = Cart()
            cart.save()
            cart_id = cart.id
            # 上記は、Cart.objects.create()と同じ意味。
            self.request.session["cart_id"] = cart_id
        cart = Cart.objects.get(id=cart_id)

        if self.request.user.is_authenticated():
            cart.user = self.request.user
            cart.save()
        return cart

    #こっちは、viewのメソッド
    def get(self, request, *args, **kwargs):
        cart  = self.get_object()
        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()
        # これはclassbasedviewではないため、contextと、templateを設定する必要あり?
        context = {
            "object": self.get_object,
        }
        template = self.template_name
        return render(request, template, context)

carts/templates/carts/carts.html を作成

{% extends "base.html" %}

{% block content %}

{{ object }} #これは、CartView().get_object()でゲットしたobject (つまりCart()のinstance)

{{ object.items.all }} # こっちは、Cart().items.all なので、cart()のitemのリスト


{% endblock %}