У меня есть модель корзины и модель продукта, этот код отлично работает, чтобы добавить каждый продукт в корзину один раз, но я хочу добавить количество продукта и обновить общее количество после добавления, но я не уверен, куда мне добавитьполе количества есть идеи?Модель моей корзины: -
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
Пожалуйста, помогите, как это сделать