Печать вложенных значений словаря, которые могут существовать или не существовать - PullRequest
0 голосов
/ 01 июля 2018

У меня есть вложенный словарь в 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, если я не уверен, существует ли оно в словаре?

1 Ответ

0 голосов
/ 01 июля 2018

Язык шаблонов Django сознательно отличается от кода Python, так что людям не рекомендуется писать в него бизнес-логику.

Но логика шаблона достаточно сильна, чтобы выполнять поиск элементов на элементах, написав это в точечной записи. Например:

<s><code>{{ books[4][1] }}</code></s>

Должно быть написано как:

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

Так что вы можете написать это как:

{% if 4 in books %}
  {% if 1 in books<b>.4</b> %}
     {{ books<b>.4.1</b> %}
  {% endif %}
{% endif %}

Как говорится, все эти поиски не нужны вообще. Поскольку Django обычно не выдаст ошибку, если поиск не удастся. В этом случае он вернется к строке TEMPLATE_STRING_IF_INVALID, когда потребуется распечатать ее. Который по умолчанию пуст, поэтому мы могли бы избежать неприятностей и написать:

{{ books.4.1 }}

, который в случае, если элемент не существует, напечатает settings.TEMPLATE_STRING_IF_INVALID (если не указано, это пустая строка).

Если вы хотите выполнить проверку, вы можете использовать if непосредственно для всей переменной, например:

{% <b>if books.4.1</b> %}
  {{ books.4.1 %}
{% endif %}

, чтобы проверить, разрешены ли выражения «переменная шаблона», и результат имеет истинность True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...