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

Djangoroidの奮闘記

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

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>