【问题标题】:Printing nested dictionary values that may or may not exist打印可能存在或不存在的嵌套字典值
【发布时间】:2018-12-09 23:22:36
【问题描述】:

我在 Python (Django) 中有一个嵌套字典,如下所示:

books = 
 { 
   1: { 1: 'Alice', 2: 'Bob', 3: 'Marta' }, 
   2: { 1: 'Alice', 3: 'Marta' }, 
   3: { 1: 'Alice', 2: 'Bob' }, 
 }

现在我想在我的模板中打印一个特定的项目,但前提是它存在,例如书籍[4][1]。但如果我这样做,我会得到:

{{ books[4][1] }}

Error: Could not parse the remainder

所以我做一个检查:

{% if 4 in books %}
  {% if 1 in books[4] %}
     {{ books[4][1] %}
  {% endif %}
{% endif %}

这也不起作用并给出解析错误(无法解析剩余部分)。如果我不确定字典中是否存在嵌套字典值,那么在 Django 中打印嵌套字典值的正确方法是什么?

【问题讨论】:

标签: python django dictionary


【解决方案1】:

Django 模板语言故意不同于 Python 代码,因此不鼓励人们将业务逻辑写入其中。

但是模板逻辑足够强大,可以通过用点表示法来对项目执行 item-getter。例如:

{{ books[4][1] }}

应该写成:

{{ books<b>.4.1</b> }}

所以你可以这样写:

{% if 4 in books %}
  {% if 1 in books.4 %}
     {{ books.4.1 %}
  {% endif %}
{% endif %}

话虽如此,所有这些查找都不是必需的。因为如果查找失败,Django 通常不会产生错误。在这种情况下,它会在需要打印时回退到TEMPLATE_STRING_IF_INVALID 字符串。默认情况下是空的,所以我们可以避免麻烦并写:

{{ books.4.1 }}

如果元素确实存在,则打印settings.TEMPLATE_STRING_IF_INVALID(如果未指定,则为空字符串)。

如果您想执行检查,可以直接在整个变量上使用if,例如:

{% if books.4.1 %}
  {{ books.4.1 %}
{% endif %}

检查这个“模板变量”表达式是否被解析,结果是否有真实性True

【讨论】:

  • 另外,您可以使用{% if books.4.1 %} 来代替单独的if 语句来获得相同的结果。
  • @Cole: 或者只是一个default 过滤器,因为如果它没有得到解决,它无论如何都会执行该回退。
  • 是的,除非在 if/endif 之间有额外的 html,这可能是最好的实现
  • 太棒了!很高兴知道这一点。它解决了这个特定的问题,虽然事实上我没有索引的键 (4, 1) 但有变量,所以我现在遇到了另一个问题。但是让我单独发布,这回答了所提出的问题。谢谢。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 2021-07-25
  • 2018-09-12
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多