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)