Как добавить количество товаров и обновить общее количество в корзине, используя django? - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть модель корзины и модель продукта, этот код отлично работает, чтобы добавить каждый продукт в корзину один раз, но я хочу добавить количество продукта и обновить общее количество после добавления, но я не уверен, куда мне добавитьполе количества есть идеи?Модель моей корзины: -

class CartManager(models.Manager):
    def new_or_get(self, request):
        cart_id = request.session.get("cart_id", None)
        qs = self.get_queryset().filter(id=cart_id)
        if qs.count() == 1:
           new_obj = False
           cart_obj = qs.first()
        else:
           cart_obj = Cart.objects.new()
           new_obj = True
           request.session['cart_id'] = cart_obj.id
       return cart_obj, new_obj

    def new(self):
        return self.model.objects.create()

class Cart(models.Model):
    products    = models.ManyToManyField(Product, blank=True)
    subtotal    = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    total       = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    created_at  = models.DateTimeField(auto_now_add=True)
    updated_at  = models.DateTimeField(auto_now=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)

файл views.py корзины: -

def cart_home(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    context = {
        'cart': cart_obj,
    }
   return render(request, "carts/home.html", context)

def cart_update(request):
    product_id = request.POST.get('product_id')
    if product_id is not None:
        try:
            item = Product.objects.get(id=product_id)
        except Product.DoesNotExist:
            print("show message to user, product doesn't exist")
            return redirect("carts:cart")
        cart_obj, new_obj = Cart.objects.new_or_get(request)
        if item in cart_obj.products.all():
            cart_obj.products.remove(item)
        else:
            cart_obj.products.add(item)
   return redirect("carts:cart")

Я обновляю промежуточную сумму корзины с помощью сигнала m2m_changed, а затем с помощью сигнала pre_save, чтобы добавить фиксированную доставкустоимость и общее количество обновлений

def m2m_changed_cart_receiver(sender, instance, action, *args, **kwargs):
    if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
        products = instance.products.all()
        total = 0
        for x in products:
            total += x.price
        if instance.subtotal != total:
            instance.subtotal = total
            instance.save()

m2m_changed.connect(m2m_changed_cart_receiver, sender=Cart.products.through)



def pre_save_cart_receiver(sender, instance, *args, **kwargs):
    if instance.subtotal > 0:
        instance.total = instance.subtotal + 50 #shiping cost
    else:
        instance.total = 0.00

pre_save.connect(pre_save_cart_receiver, sender=Cart)

Я хочу добавить количество и обновить его, используя такой сигнал, но я не знаю, куда мне добавить это поле количества, оно должно быть для каждого продукта в корзине,пример: -

Cart 1 contains 2 products
product 1 (quantity 2) price of the unit is 50 , total = 50
product 2 (quantity 3) price of the unit is 100 , total = 200
cart total now is 250
I should take the quantity from the user and then multiple it with the unit price then 
update the total of the cart

Пожалуйста, помогите, как это сделать

...