Здесь при добавлении товара в корзину и последующем увеличении количества товара. Работает отлично. Элемент корзины увеличивает общее количество элементов корзины, и общее количество автомобилей также получает правильное значение. Но когда я удаляю предмет или уменьшаю количество этого предмета, модель CartItem
работает, а в модели Cart
total
не меняется. Сумма остается неизменной при добавлении товаров в корзину.
cart models.py
# Create your models here.
class CartItem(models.Model):
owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
item = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
item_total = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)
def __str__(self):
return f"{self.quantity} of {self.item.name}"
def pre_save_cart_item(sender, instance, *args, **kwargs):
instance.item_total = instance.quantity * instance.item.price
pre_save.connect(pre_save_cart_item, sender=CartItem)
class Cart(models.Model):
owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, related_name='cart')
items = models.ManyToManyField(CartItem)
number_of_items = models.PositiveIntegerField(default=0)
total = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
purchased = models.BooleanField(default=False)
def __str__(self):
return f"User: {self.owner}, items in cart {self.number_of_items}"
def m2m_save_cart(sender, action, instance, *args, **kwargs):
if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
instance.number_of_items = instance.items.count()
items = instance.items.all()
instance.total = 0
for x in items:
instance.total += x.item_total
instance.save()
m2m_changed.connect(m2m_save_cart, sender=Cart.items.through)
cart views.py
def add_to_cart(request, slug):
item = get_object_or_404(Product, slug=slug)
cart_item, created = CartItem.objects.get_or_create(
item=item,
owner = request.user,
)
cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
if cart_qs.exists():
cart = cart_qs[0]
if cart.items.filter(item__slug=item.slug).exists():
cart_item.quantity += 1
cart_item.save()
return redirect('products:product-list')
else:
cart.items.add(cart_item)
return redirect('products:product-list')
else:
cart = Cart.objects.create(
owner=request.user
)
cart.items.add(cart_item)
return redirect('products:product-list')
def remove_from_cart(request, slug):
item = get_object_or_404(Product, slug=slug)
cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
if cart_qs.exists():
cart = cart_qs[0]
print('cart_qs exists')
if cart.items.filter(item__slug=item.slug).exists():
print('item exists in cart')
cart_item = CartItem.objects.filter(
item = item,
owner = request.user,
)[0]
cart.items.remove(cart_item)
print('removed from cart')
cart_item.delete()
return redirect('products:product-list')
else:
print('item not in cart')
return redirect('')
else:
return redirect('')
print('no cart_qs')
def remove_single_item_from_cart(request, slug):
item = get_object_or_404(Product, slug=slug)
cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
if cart_qs.exists():
cart = cart_qs[0]
print('cart_qs exists')
if cart.items.filter(item__slug=item.slug).exists():
print('item exists in cart')
cart_item = CartItem.objects.filter(
item = item,
owner = request.user,
)[0]
if cart_item.quantity > 1:
cart_item.quantity -= 1
cart_item.save()
print(item,'quantity decreased')
else:
cart.items.remove(cart_item)
print('removed from cart')
return redirect('products:product-list')
else:
print('item not in cart')
return redirect('products:product-list')
else:
print('no cart_qs')
return redirect('products:product-list')
def m2m_save_cart
функция теперь работает как положено. Каждый элемент я добавляю или удаляю или уменьшаю количество. Эта функция должна сохранить изменения. Он работает как number_of_items
, но total
не