cart.py
class Cart(object):
def __init__(self,request):
self.session = request.session
cart = self.session.get(settings.CART_SESSION_ID)
if not cart:
# save an empty cart in the session
cart = self.session[settings.CART_SESSION_ID] = {}
self.cart = cart
def add(self,product,quantity = 1,update_quantity = False):
'''
Add a product to the cart or update its quantity
'''
product_id = str(
product.id)
print(product_id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity':0,'price':str(product.price)}
if update_quantity:
self.cart[product_id]['quantity'] = quantity
else:
self.cart[product_id]['quantity']+=quantity
self.save()
def save(self):
#mark the session as "modidied" to make sure it gets saved
self.session.modified = True
def remove(self, product):
'''
remove a product from the cart
'''
product_id = str(
product.id)
if product_id in self.cart:
del self.cart[product_id]
self.save()
def __iter__(self):
'''
Iterate over the items in the cart and get the products from the database
'''
product_ids = self.cart.keys()
# get the product objects and add them to the cart
products = Product.objects.filter(id__in=product_ids)
cart = self.cart.copy()
for product in products:
cart[str(
product.id)]['product'] = product
for item in cart.values():
item['price'] = Decimal(item['price'])
item['total_price'] = item['price'] * item['quantity']
yield item
def __len__(self):
"""
count all the items in the cart
"""
return sum(item['quantity'] for item in self.cart.values())
def get_total_price(self):
return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values())
def clear(self):
#remove cart from session
del self.session[settings.CART_SESSION_ID]
self.save()
views.py(cart)
@require_POST
def cart_add(request,product_id):
cart = Cart(request)
product = get_object_or_404(Product,id = product_id)
form = forms.CartAddProductForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cart.add(product = product,quantity = cd['quantity'],update_quantity = cd['update'])
return redirect('cart_detail')
def cart_remove(request,product_id):
cart = Cart(request)
product = get_object_or_404(Product,id = product_id)
cart.remove(product)
return redirect('cart_detail')
def cart_detail(request):
cart = Cart(request)
for item in cart:
print(item)
for item in cart:
item['update_quantity_form'] = forms.CartAddProductForm(
initial = {'quantity':item['quantity'],
'update' : True}
)
return render (request,'cart/cartdetail.html',{'cart':cart})
here len of item is 0