簡體   English   中英

在django模板中循環遍歷DefaultDict時出現奇怪的運行時錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM