Python 在django模板中的DefaultDict上循环时出现奇怪的运行时错误

Python 在django模板中的DefaultDict上循环时出现奇怪的运行时错误,python,django,Python,Django,使用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 %} .......... {% en

使用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\u to\u response
方法之前的
count\u by\u media\u type
值为
defaultdict(,{u'photo':1,u'audio':4,u'video':3})

但不知何故,在渲染时,迭代中存在运行时错误

字典在迭代过程中更改了大小

在模板上下文中看到的
count\u by\u media\u type
的值变为

defaultdict(,{u'photo':1,u'audio':4,u'video':3,u'media\u type':0})

这很奇怪,因为变量中是如何出现一个新的键
media\u type

现在,当我切换上面的代码时,在视图中提到

count\u by\u media\u type=计数器([user\u media['media\u type']用于用户\u media\u数据中的用户\u media])

一切正常


有什么线索吗

由于模板变量查找的工作方式,使用
defaultdict
s会导致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

我猜在for循环中,您直接或间接地访问
count\u by\u media\u type.get('media\u type')
,因此
defaultdict
会被修改。你说得对。我通过{count\u by\u media\u type.media\u type}访问该值。我没有意识到这一点。谢谢,我松了一口气:)顺便说一句,你可能会发现循环项目比循环键更容易:
{%for media\u type,count in count\u by\u media\u type.iteritems%}{{count}{%endfor%}
。你仍然需要使用我下面的答案中的一个补丁。是的@Alasdair,将它变成dict肯定会成功。不过,我还是继续进行柜台收款。谢谢你的回答。Django医生真的很好。@HåkenLid是的,他们现在有了这张票。