[英]Weird runtime error when looping over DefaultDict in django template
使用Django 1.5.1
我這里有一個簡單的代碼 -
count_by_media_type = defaultdict(int)
for user_media in user_media_data:
count_by_media_type[user_media['media_type']] += 1
這是視圖的一部分,使用for迭代循環在模板中呈現 -
{% for media_type in count_by_media_type %}
..........
{% endfor %}
在循環中render_to_response
方法之前的count_by_media_type
的值是defaultdict(<type 'int'>, {u'photo': 1, u'audio': 4, u'video': 3})
但不知何故,在渲染時,迭代中存在運行時錯誤
dictionary changed size during iteration
並且在模板上下文中看到的count_by_media_type
的值變為
defaultdict(<type 'int'>, {u'photo': 1, u'audio': 4, u'video': 3, u'media_type': 0})
這很奇怪,因為新的關鍵media_type
如何進入變量?
現在,當我切換上面的代碼時,在視圖中提到了
count_by_media_type = Counter([user_media['media_type'] for user_media in user_media_data])
一切正常。
有人提出任何線索嗎?
由於模板變量查找的工作方式,使用defaultdict
會導致Django模板中的奇怪行為。 請參閱Django文檔 的幕后框。
Django文檔建議在傳遞給模板之前將defaultdict
轉換為常規dict
。
count_by_media_type = defaultdict(int)
for user_media in user_media_data:
count_by_media_type[user_media['media_type']] += 1
count_by_media_type = dict(count_by_media_type)
或者,正如此答案所示 ,您可以在完成插入值后禁用默認功能。
count_by_media_type.default_factory = None
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.