.items 不适用于 Django 模板中的 defaultdict
Posted
技术标签:
【中文标题】.items 不适用于 Django 模板中的 defaultdict【英文标题】:.items not working on defaultdict in Django template 【发布时间】:2015-12-25 03:14:18 【问题描述】:我无法让 .items 在我的 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 的第二个版本不起作用?
【问题讨论】:
您的第一个示例模板没有明显的问题。检查拼写错误或意外重新分配context['data']
或删除assertion_dict
中的项目。
为了排除拼写错误和其他问题,我同时在上下文中发送了两者,并复制/粘贴了视图、模板和生成的 html 输出。使用此信息更新问题。
我会 a) 在模板的某处添加 data
转储 - Python dicts 以合理的方式进行字符串化,这应该有助于验证您的 data
变量是否包含您期望的内容 - b) 临时设置您的TEMPLATE_STRING_IF_INVALID
设置,如下所述:***.com/a/8990344/2337736
添加data
dump
添加了 string_if_invalid
【参考方案1】:
这是known issue in Django:您不能在模板中迭代defaultdict
。文档建议to handle this 的最佳方法是将您的defaultdict
转换为dict
,然后再将其传递给模板:
context['data'] = dict(assertion_dict)
顺便说一句,它不起作用的原因是,当您在模板中调用 data.items
时,Django 将首先尝试查找data['items']
,然后再查找data.items
。 defaultdict
将为前者返回一个默认值,因此 Django 不会尝试后者,您最终会尝试遍历默认值而不是 dict。
【讨论】:
以上是关于.items 不适用于 Django 模板中的 defaultdict的主要内容,如果未能解决你的问题,请参考以下文章