Djangoroidの奮闘記

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

Django e-commerce part45 Cart Line Item Total

pre-save signalを使って、line itemのtotalを表示する

CartItemにline_item_totalを追記

class CartItem(models.Model):
    cart = models.ForeignKey("Cart")
    item = models.ForeignKey(Variation)
    quantity = models.PositiveIntegerField(default=1)
    line_item_total = models.DecimalField(max_digits=10, decimal_places=0)

    def __str__(self):
        return self.item.title

    def remove(self):
        return self.item.remove_from_cart()

model を変更したので、migrateしておく

pre saveを記述する。

sender=CartItemから、pre_saveのsignalを受け取ったら、cart_item_pre_save_receiverを実行する。

def cart_item_pre_save_receiver(sender, instance, *args, **kwargs):
    qty = instance.quantity
    if qty >= 1:
        price = instance.item.get_price()
        line_item_total = qty * price
        instance.line_item_total = line_item_total

pre_save.connect(cart_item_pre_save_receiver, sender=CartItem)

decimal,intあたりでerrorが出るので、以下のように修正した

from decimal import Decimal
...

def cart_item_pre_save_receiver(sender, instance, *args, **kwargs):
    qty = instance.quantity
    if int(qty) >= 1:
        price = instance.item.get_price()
        line_item_total = Decimal(qty) * Decimal(price)
        instance.line_item_total = line_item_total

pre_save.connect(cart_item_pre_save_receiver, sender=CartItem)