Django -сигналы m2mmd, выдача сигнала - PullRequest
0 голосов
/ 06 апреля 2020

Здесь при добавлении товара в корзину и последующем увеличении количества товара. Работает отлично. Элемент корзины увеличивает общее количество элементов корзины, и общее количество автомобилей также получает правильное значение. Но когда я удаляю предмет или уменьшаю количество этого предмета, модель 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 не

...