用循环混淆向Dict添加表单

时间:2016-03-27 02:10:27

标签: django python-2.7

我正在阅读“在线商店”一章(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方法,我认为这可能是我的问题的答案。

1 个答案:

答案 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}}