我正在阅读“在线商店”一章(6)中的“Django By Example”,我对视图中的一段简单代码感到困惑:
def cart_detail(request):
cart = Cart(request)
for item in cart:
item['update_quantity_form'] = CartAddProductForm(initial={'quantity': item['quantity'],'update': True})
return render(request, 'cart/detail.html', {'cart': cart})
它显然会在购物车中为每个产品添加一个表单,因此可以更新数量(对于购物车中的每个产品)。 。购物车只是一个字典,保存在会话中,这让我想到了问题。 。
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 __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)
for product in products:
self.cart[str(product.id)]['product'] = product
for item in self.cart.values():
item['price'] = Decimal(item['price'])
item['total_price'] = item['price'] * item['quantity']
yield item
在视图 for循环中,是否会尝试将item ['update_quantity_form'] = CartAddProductForm(...)
添加到购物车中,这是一个dict会导致类型错误?像TypeError: 'int' object does not support item assignment
?
如果我在IDLE中制作一个dict来模仿购物车cart[1]={'quantity':30, 'price':15.00}
和cart[2] = {'quantity':2, 'price':11.00}
,那么for item in cart: item['update_quantity_form']='form'
我明显会遇到类型错误(如上所述)。
所以,我不明白他的书中的代码是如何运作的。我意识到我错过了一些非常简单的东西,但却遗漏了它。提前谢谢。
编辑:编辑以添加Iter方法,我认为这可能是我的问题的答案。
答案 0 :(得分:1)
购物车存储为Cart
对象,不为简单dict
。重写的__iter__
方法会导致for
循环的行为不同。请注意方法末尾的yield item
,它将生成.values()
个存储的dict
之一。所以它或多或少等同于IDLE中的以下内容:
>>> cart = {}
>>> cart[1] = {'quantity':30, 'price':15.00}
>>> cart[2] = {'quantity':2, 'price':11.00}
>>> for item in cart.values():
... item['update_quantity_form'] = 'form'
...
>>> cart
可以正常工作并打印
{1: {'price': 15.0, 'update_quantity_form': 'form', 'quantity': 30},
2: {'price': 11.0, 'update_quantity_form': 'form', 'quantity': 2}}