Django e-commerce part43 Format Cart & Remove Items
Cart VIewの編集と、Itemの削除
carts/view.html の追記
削除ボタンをつける。
{% extends "base.html" %} {% block content %} {{ object }} {{ object.cartitem_set.all }} <table class='table'> {% for item in object.cartitem_set.all %} <tr> <td>{{ item }}</td> <td>{{ item.quantity }}</td> <td>{{ item.line_total }}</td> <td class='text-right'><a href='#'>削除</a></td> </tr> {% endfor %} </table> {% endblock %}
models.py にremove functionを追記する。
from django.core.urlresolvers import reverse class CartItem(models.Model): cart = models.ForeignKey("Cart") item = models.ForeignKey(Variation) quantity = models.PositiveIntegerField(default=1) #line item total def __str__(self): return self.item.title def remove(self): return "%s?item=%s&delete=True" %(reverse("cart"), self.item.id)
これはreturnとして、/cart/?item=13&delete=True
のような文字列を返す。
products/models.pyのVariationに、add_to_cart functionを追記する。
def add_to_cart(self): return "%s?item=%s&qty=1" %(reverse("cart"), self.id)
このremoveと、add_to_cart に関しては、request のパラメータが、?item=id&qty=qty になると、cartにitemが追加される。(また、delete=True になると削除される)ことを利用して、requestに値を代入して、機能を実装するという方針。ちょっとこれは分かりづらいかもなぁ。。
removeもproducts/models.py に追記する。
def add_to_cart(self): return "%s?item=%s&qty=1" %(reverse("cart"), self.id) def remove_from_cart(self): return "%s?item=%s&qty=1&delete=True" %(reverse("cart"), self.id)
こういう感じ。
carts/models.py を修正
class CartItem(models.Model): ... def remove(self): return self.item.remove_from_cart() ...
carts/views.html を修正
<td class='text-right'><a href='#'>{{ item.remove }} {{ item.item.remove_from_cart }}</a></td>
上記は全く同じ意味のコード。これでテストして、同じ文字列が出てきたら、OKです。
<td class='text-right'><a href='{{ item.remove }}'>削除</a></td>
hrefに、item.removeを設定する。これで削除ボタンの完成!
carts/models.py を修正
get_titleをproductのtitleと、variationのtitleが表示されるようにする。
class CartItem(models.Model): ... def get_title(self): return "%s - %s" %(self.item.product.title, self.item.title) ...
get_titleは、products/models.pyに移転可能なため、そちらに転載する。
class Variation(models.Model): ... def get_title(self): return "%s - %s" %(self.product.title, self.title) ...
あとは、view.html の get_titleも少し変更する。
<td>{{ item.item.get_title }}</td>