无法在django中迭代嵌套的dict

时间:2010-05-08 16:46:03

标签: python django google-app-engine

我试图迭代一个嵌套的词典列表。第一级工作正常。但是第二级被视为字符串而不是字典。

在我的模板中,我有这个:

{% for product in Products %}
<li>
    <p>{{ product }}</p>
    {% for partType in product.parts %}
        <p>{{ partType }}</p>
        {% for part in partType %}
            <p>{{ part }}</p>
        {% endfor %}
    {% endfor %}
</li>
{% endfor %}

{{part}}只是根据partType列出1个字符。它接缝处理它就像一根绳子。但是我可以通过点符号到达所有字典而不是for循环。当前输出如下所示:

    Color    
C    
o    
l    
o    
r    
Style    
S
.....

Products对象在日志中如下所示:

[{'product': <models.Products.Product object at 0x1076ac9d0>, 'parts': {u'Color': {'default': u'Red', 'optional': [u'Red', u'Blue']}, u'Style': {'default': u'Nice', 'optional': [u'Nice']}, u'Size': {'default': u'8', 'optional': [u'8', u'8.5']}}}]

我要做的是将来自多个不同SQL查询的产品的dict / list组合在一起。

Web处理程序如下所示:

typeData = Products.ProductPartTypes.all()
    productData = Products.Product.all()
    langCode = 'en'
    productList = []

    for product in productData:
        typeDict = {}
        productDict = {}
        for type in typeData:
            typeDict[type.typeId] = { 'default' : '', 'optional' : [] }

        productDict['product'] = product
        productDict['parts'] = typeDict

        defaultPartsData = Products.ProductParts.gql('WHERE __key__ IN :key', key = product.defaultParts)
        optionalPartsData = Products.ProductParts.gql('WHERE __key__ IN :key', key = product.optionalParts)

        for defaultPart in defaultPartsData:
            label = Products.ProductPartLabels.gql('WHERE __key__ IN :key AND partLangCode = :langCode', key = defaultPart.partLabelList, langCode = langCode).get()
            productDict['parts'][defaultPart.type.typeId]['default'] = label.partLangLabel

        for optionalPart in optionalPartsData:
            label = Products.ProductPartLabels.gql('WHERE __key__ IN :key AND partLangCode = :langCode', key = optionalPart.partLabelList, langCode = langCode).get()
            productDict['parts'][optionalPart.type.typeId]['optional'].append(label.partLangLabel)

        productList.append(productDict)    

    logging.info(productList)
    templateData = { 'Languages' : Settings.Languges.all().order('langCode'), 'ProductPartTypes' : typeData, 'Products' : productList }

我尝试过多种不同的方式制作字典。就像先制作一个清单,然后是一个字典,使用郁金香,我能想到的任何东西。

欢迎任何帮助!

Bouns:如果有人对SQL quires有其他方法,那就更受欢迎了。我觉得运行那么多的quires有点蠢。每个产品部件在langCode上都有不同的标签。

..弗雷德里克

1 个答案:

答案 0 :(得分:7)

迭代dict会产生密钥。您需要iteritems()itervalues()方法。

{% for partName, partType in product.parts.iteritems %}
    <p>{{ partName }}</p>
    {% for part in partType %}
        <p>{{ part }}</p>
    {% endfor %}
  ....