2016-05-27 52 views
0

我有以下數據重複數據:如何在python-的Django

[{ 
    'mp': [ < MpbMealPlan: MpbMealPlan object > , < MpbMealPlan: MpbMealPlan object > ], 
    'user': [ < User: mpowner mpowner > ] 
}, { 
    'mp': [ < MpbMealPlan: MpbMealPlan object > , < MpbMealPlan: MpbMealPlan object > ], 
    'user': [ < User: kvermaOwner Owner > ] 
}] 

我要重複它在我的Django的模板。如圖所示,這是兩個記錄,每個記錄有兩個鍵(mp和用戶),每個記錄屬於特定用戶。所以我想這樣我可以獲得用戶的mps和用戶的詳細信息。但是當我嘗試按照下面的答案或任何其他答案的方式迭代它時,我每次都會得到奇怪的結果。 mp可以包含更多的記錄,但我只是在第一次迭代時卡住了。我對Python非常陌生,這是我第三天的工作。任何指導都能節省我的一天。

只要我遵循以下原則:

{% for contributor in contributors.details %} 

    {{ contributor }} 

{% endfor %} 

,我得到這個輸出,突破該起伏結構:

{ 
    'mp': [ < MpbMealPlan: MpbMealPlan object > , < MpbMealPlan: MpbMealPlan object > ], 
    'user': [ < User: mpowner mpowner > ] 
} { 
    'mp': [ < MpbMealPlan: MpbMealPlan object > , < MpbMealPlan: MpbMealPlan object > ], 
    'user': [ < User: kvermaOwner Owner > ] 
} 

一個查詢:它甚至有可能得到所需的數據結果我有。我想迭代它來獲得mp和用戶,然後我想迭代mp來獲取其中的多個記錄。 因爲每當我嘗試迭代到任何級別,我得到的所有記錄,所以鍵「mp和用戶」不解決我的目的。

我不想在這裏浪費任何人的時間。 我已經更新了這個問題。直到現在,感謝您的答覆。 更新:

以下是我使用的方法,並得到了想要的結果:

{% for contributor in contributors.details %} 

    {% for user in contributor.user %} 
     {{ user }} 
     <br> 

     {% for mp in contributor.mp %} 

      {{ mp.mp_name }} 
      <br> 
     {% endfor %} 


    {% endfor %} 

{% endfor %} 

結果:

user:mpowner mpowner 
mp:Fresh & Healthy 
mp:evening snacks 
user:kvermaOwner Owner 
mp:Fresh & Healthy 
mp:Energizing 

最後我得到了想要的輸出與C14L的幫助(令人驚歎的指導)。感謝「ajabdelaziz」等人。

+1

告訴我們你到目前爲止試過的東西 – AK47

+1

我認爲重複這個問題http://stackoverflow.com/questions/8018973/how-to-iterate-through-dictionary-in-a-dictionary-in-django-模板 – se0kjun

+0

@ se0kjun我已經試過這個答案,但沒有幫助。仍然得到錯誤的結果。如果像我這樣的人可以貼上答案,我會在每個循環之後申請。 – Simer

回答

1

對於Python3,調用.items()會爲您提供項目。

for key, item in data.items(): 

對於Python2使用iteritems()

for k, v in knights.iteritems(): 

在Django的模板:

<div> 
    {% for k,v in test.items %} 
    <p>{{ k }} --> {{ v }}</p> 
    {% endfor %} 
</div> 

文檔:https://docs.python.org/3/tutorial/datastructures.html#looping-techniques

編輯:

012 '熔點':

要在這個部分添加到應答,看着你的特定對象

[('details', [{ 
    'mp': u '[{"fields": {"status": 

U' [{ 「田」:{「ST

也就是說一個list(),它是一個字符串:u''

當你循環一個字符串,你得到的單個字符的字符串包含一個接一個。因此這個「奇怪」的結果。

編輯2:

兩個contributor.mpcontributor.user包含列表

{% for contributor in contributors.details %} 
    {{ contributor.mp }} 
    {{ contributor.user }} 
{% endfor %} 

如此,例如打印所有的用戶名,你可以做

{% for contributor in contributors.details %} 
    {% for user in contributor.user %} 
     {{ user.username }} 
    {% endfor %} 
{% endfor %} 

要打印的清單mp項目,你可以做

{% for contributor in contributors.details %} 
    {% for mp in contributor.mp %} 
     {{ mp }} 
    {% endfor %} 
{% endfor %} 

但是,每個mp對象可能具有許多屬性。你需要查看你的類定義是什麼樣的。

+0

我想要做的是django模板。它也可以在模板中工作嗎? – Simer

+1

是的,也適用,我將它添加到答案 – C14L

+0

再次感謝。 'mp'之前的'u'是因爲我使用了serializers.serialize(「json」,model.getUserById(contributor_id))來獲取'mp'的數據。我更新了我的問題。你真的在幫助謝謝! – Simer

1

從我看到的基於你的錯誤,是你試圖迭代mp與它有一個字典和列表價值。由於數據類型不同,因此只能使用.items()。您需要使用.items()來獲取mp值的關鍵值。那麼你將不得不處理遍歷列表,然後重複鍵值。 C14L的答案顯示瞭如何在模板中做到這一點,只是不要忘記你的數據類型!

即 -

<div> 
    {% for k,v in test.items %} 
     {% for item in v%} 
      {% item %} 
     {% endfor %}  
    {% endfor %} 
    </div> 

項目將是列表,然後可以遍歷獲得額外的鍵值對。

另一種可能的解決方案是在模板標籤過濾器中完成大部分工作。然後將過濾器應用到您想要過濾的選定變量上。