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