我试图迭代一个嵌套的词典列表。第一级工作正常。但是第二级被视为字符串而不是字典。
在我的模板中,我有这个:
{% 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上都有不同的标签。
..弗雷德里克
答案 0 :(得分:7)
迭代dict会产生密钥。您需要iteritems()
或itervalues()
方法。
{% for partName, partType in product.parts.iteritems %}
<p>{{ partName }}</p>
{% for part in partType %}
<p>{{ part }}</p>
{% endfor %}
....