Атрибут остается после удаления объекта модели
Когда клиент добавляет товар в корзину, в корзине отображается items
и cartItems
и все остается как должно быть, но когда кто-то удаляет реальный продукт из списка продуктов, items
тоже удаляется как должно быть, но cartItems
или количество продуктов, которое было добавлено, остается после того, как продукт не существует, я пытаюсь удалить это, когда продукт не выходит! Текущий код выдает мне эту ошибку, индексы списка должны быть целыми числами или срезами, а не str
Модель
class Order(models.Model):
...
@property
def get_cart_items(self):
orderitems = self.orderitem_set.all()
total = sum([item.quantity for item in orderitems])
return total
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, blank=True, null=True)
quantity = models.IntegerField(default=0)
Utils
def cookieCart(request):
try:
cart = json.loads(request.COOKIES['cart'])
except:
cart = {}
#cart prints out this structure '{"15":{"quantity":1}}'
print('Cart:', cart)
items = []
order = {'get_cart_total': 0, 'get_cart_items': 0, 'shipping': False}
cartItems = order['get_cart_items']
for i in cart:
try:
cartItems += cart[i]["quantity"]
product = Product.objects.get(id=i)
total = (product.final_price * cart[i]["quantity"])
order['get_cart_total'] += total
order['get_cart_items'] += cart[i]["quantity"]
item = {
'product':{
'id':product.id,
'name':product.name,
'final_price':product.final_price,
'image_URL':product.image_URL,
'availability':product.availability,
},
'quantity':cart[i]["quantity"],
'get_total':total,
}
items.append(item)
except:
pass
# clear cartItems if Product does not exist with the same id as cartItems
ids = all(items['product']['id'])
for id in ids:
if not Product.objects.filter(pk=id):
cartItems.delete()
return {"items": items, "order": order, "cartItems": cartItems}
def cartData(request):
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
items = order.orderitem_set.all()
cartItems = order.get_cart_items
else:
cookieData = cookieCart(request)
cartItems = cookieData['cartItems']
order = cookieData['order']
items = cookieData['items']
return {'cartItems':cartItems ,'order':order, 'items':items}
Виды
def cart(request):
data = cartData(request)
items = data['items']
cartItems = data['cartItems']
Traceback
Traceback (most recent call last):
File "D:\test\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\test\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\test\shop\views.py", line 11, in shop
data = cartData(request)
File "D:\test\shop\utils.py", line 66, in cartData
cookieData = cookieCart(request)
File "D:\test\shop\utils.py", line 46, in cookieCart
ids = all(items['product']['id'])
Exception Type: TypeError at /
Exception Value: list indices must be integers or slices, not str