Как суммировать целочисленное поле с числом в модели django 5 и сохранить его
у меня есть модель cartitem:
class CartItem(models.Model):
cart=models.ForeignKey(Cart,related_name='items',on_delete=models.CASCADE)
product=models.ForeignKey(Product,on_delete=models.CASCADE)
quantity=models.PositiveIntegerField(default=0)
при добавлении товара в корзину в режиме просмотра :
class AddToCartView(LoginRequiredMixin,View):
model = Product
def post(self, request, *args, **kwargs):
product = get_object_or_404(Product, pk=kwargs['pk'])
cart, created = Cart.objects.get_or_create(user=request.user)
cart_item, created = CartItem.objects.get_or_create(cart=cart, product=product)
# POST request
quantity = request.POST.get('quantity')
try:
quantity=int(quantity) if quantity else 1
except ValueError:
quantity=1
cart_item.quantity +=quantity
cart_item.save()
# Redirect to cart detail view
return reverse_lazy('shop:home')
В представлении произошла ошибка: Attribute Error at /product/2/add-to-cart/ proxy объект не имеет атрибута get помогите пожалуйста.
добавьте товар в корзину с помощью этого кода:
cart_item.quantity +=quantity
, но произошла ошибка.
Проблема заключается в том, что вы возвращаете результат reverse_lazy(…)
[Django-doc] в качестве ответа, но это не ответ HTTP. Поэтому вместо него следует использовать return redirect('shop:home')
.
Мы можем немного сократить количество запросов, отказавшись от получения Product
дополнительным запросом, а в случае создания сразу добавить его с нужным количеством:
from django.shortcuts import redirect
class AddToCartView(LoginRequiredMixin, View):
model = Product
def post(self, request, *args, **kwargs):
quantity = request.POST.get('quantity')
try:
quantity = int(quantity) if quantity else 1
except ValueError:
quantity = 1
cart, created = Cart.objects.get_or_create(user=request.user)
cart_item, created = CartItem.objects.get_or_create(
cart=cart,
product_id=self.kwargs['product_id'],
defaults={'quantity': quantity},
)
if not created:
cart_item.quantity = F('quantity') + 1 # avoids a race condition
cart_item.save()
return redirect('shop:home')