【问题标题】:.items not working on defaultdict in Django template.items 不适用于 Django 模板中的 defaultdict
【发布时间】: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 设置,如下所述:stackoverflow.com/a/8990344/2337736
  • 添加{{data}}dump
  • 添加了 string_if_invalid

标签: python django dictionary django-templates


【解决方案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。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2012-04-26
    • 2016-05-26
    • 2016-11-13
    • 2019-01-19
    • 2018-09-19
    • 2015-12-25
    • 2021-07-26
    相关资源
    最近更新 更多