Python 在django模板中的DefaultDict上循环时出现奇怪的运行时错误
使用Django 1.5.1 我这里有一个简单的代码-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
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是的,他们现在有了这张票。