.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 添加datadump 添加了 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.itemsdefaultdict 将为前者返回一个默认值,因此 Django 不会尝试后者,您最终会尝试遍历默认值而不是 dict。

【讨论】:

以上是关于.items 不适用于 Django 模板中的 defaultdict的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 不适用于 Django 模板继承

Css 静态引用不适用于 Django 模板

Django模板标签切片不适用于表单切片

使用模板变量时,Django google-maps API v3 不适用于 Chrome

Django dictsort 不适用于日期

为啥css文件不适用于html文件 - Django