2010-05-08 46 views
0

我試圖迭代一個嵌套的字典列表。第一級工作正常。但是第二層被視爲字符串而不是字典。無法迭代在django中的嵌套字典

在我的模板我有這樣的:

{% 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 %} 

這是{{部分}},只是列出1和焦炭在基於partType的時間。它接縫,它被視爲一個字符串。然而,我可以通過點符號達到所有字典,但不能用for循環。電流輸出是這樣的:

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

產品物體看起來像這樣在日誌中:

[{'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查詢。

的網絡處理程序是這樣的:

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,那就更受歡迎了。我覺得運行這麼多問題有點愚蠢。發生了什麼,每個產品部件在langCode上都有不同的標籤。

..fredrik

+0

App Engine數據存儲不使用SQL查詢。 – geoffspear 2010-05-08 20:44:32

+0

哦,我的壞。我的意思是GQL :) – fredrik 2010-05-09 13:35:01

回答

7

對dict進行迭代得到密鑰。您需要iteritems()itervalues()方法。

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

甜,謝謝。只有一個人可能需要知道是否使用Google App Engine,您需要將django版本設置爲1.1。 GAE中的標準版本爲0.96,不支持5個關鍵字for循環。 – fredrik 2010-05-08 20:06:49