2015-09-27 31 views
3

我不能讓.items在我的Django模板的工作:.items不工作defaultdict在Django模板

副本,並從我的CBV的get_context_data粘貼:

context['data'] = assertion_dict 
    context['dataitems'] = assertion_dict.items() 

    return context 

複製和粘貼從我的模板:

<h3>data dump</h3> 
    {{data}} 

    <h3>dataitems</h3> 
    {% for key, value in dataitems %} 
    {{ key }}: {{ value }} <br/> 
    {% endfor %} 

    <h3>data.items</h3> 
    {% for key, value in data.items %} 
    {{ key }}: {{ value }} <br/> 
    {% endfor %} 

    <h3>Not found test</h3> 
    {{ i_dont_exist }} 

輸出:

**data dump** 
defaultdict(<class 'list'>, {<BadgeType: Talent>: [<BadgeAssertion: Blender Blue Belt>], <BadgeType: Achievement>: [<BadgeAssertion: MyBadge#1>, <BadgeAssertion: MyBadge#1>, <BadgeAssertion: MyBadge#2>], <BadgeType: Award>: [<BadgeAssertion: Copy of Copy of Blenbade>]}) 

**dataitems** 
Talent: [<BadgeAssertion: Blender Blue Belt>] 
Achievement: [<BadgeAssertion: MyBadge#1>, <BadgeAssertion: MyBadge#1>, <BadgeAssertion: MyBadge#2>] 
Award: [<BadgeAssertion: Copy of Copy of Blenbade>] 

**data.items** 

**Not found test** 
DEBUG WARNING: undefined template variable [i_dont_exist] not found 

爲什麼第二個版本不能工作,在我的模板中使用data.items?

+0

你的第一個示例模板沒有什麼明顯的錯誤。檢查錯誤或意外重新分配'context ['data']'或刪除'assertion_dict'中的項目。 –

+0

爲了排除拼寫錯誤和其他問題,我同時在上下文中發送了這兩個問題,並複製/粘貼了視圖,模板和生成的HTML輸出。問題用這個信息更新。 – 43Tesseracts

+0

我會a)在模板的某個地方添加一個'{{data}}'的轉儲 - Python以合理的方式進行字符串化,並且這應該有助於驗證您的'data'變量是否包含您期望的 - 以及b)按照此處所述臨時設置您的「TEMPLATE_STRING_IF_INVALID」設置:http://stackoverflow.com/a/8990344/2337736 –

回答

5

這是一個known issue in Django:您無法遍歷模板中的defaultdict。該文檔顯示,最好的辦法to handle this是將它傳遞給模板之前轉換您defaultdictdict

context['data'] = dict(assertion_dict) 

這是行不通的,順便說一下原因,是當你在打電話{{ data.items }}您模板,Django將首先嚐試查找data['items'],然後data.itemsdefaultdict將爲前者返回默認值,因此Django不會嘗試後者,並且最終嘗試循環使用默認值而不是字典。