打印可能存在或不存在的嵌套字典值

时间:2018-07-01 14:28:45

标签: python django dictionary

我在Python(Django)中有一个嵌套的字典,就像这样:

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

现在,在我的模板中,我想打印一个特定的项目,但是仅当它存在时,例如books [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中打印嵌套字典值的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

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

但是模板逻辑足够强大,可以通过用点表示法编写代码来对项目执行项目获取。例如:

{{ books[4][1] }}

应写为:

{{ books.4.1 }}

所以您可以这样写:

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

话虽如此,所有这些查找完全没有必要。由于Django通常会在查找失败时 not 产生错误。在这种情况下,当需要打印时,它将回退到TEMPLATE_STRING_IF_INVALID字符串。默认情况下该字段为空,因此我们可以避免麻烦并写:

{{ books.4.1 }}

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

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

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

检查此“模板变量”表达式是否得到解析,结果是否具有真实性 True