Как добавить новую запись в объект словаря при использовании jinja2?

Я не могу добавить новую запись в словарь объекта при использовании шаблона jinja2.

Например, здесь я использую шаблон jinja2 и создал переменную data, которая является словарем. И после проверки некоторых условий if я хочу добавить атрибут местоположения к объекту данных, например

{%- set data = {
                  'name' : node.Name,
                  'id' : node.id,
               }
-%}

{% if node.location !="" %}
    data.append({'location': node.location}) 
{% endif %}

Однако я не смог найти способ добиться этого и получаю UndefinedError:

jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'append'

Кто-нибудь сталкивался с этой проблемой или может предоставить ссылку для ее решения?

Я искал в Интернете, но не смог найти решение, то есть, как добиться добавления записи в объект dict в Jinja.

Я сослался на следующие и другие веб-ресурсы:

  1. http://cewing.github.io/training.codefellows/assignments/day22/jinja2_walkthrough.html
  2. В Jinja2, какой самый простой способ установить все ключи в значения словаря?
  3. https://github.com/saltstack/salt/issues/27494

Ответ 1

Без расширения jinja2.ext.do вы можете сделать это:

{% set x=my_dict.__setitem__("key", "value") %}

Не учитывайте переменную x и используйте словарь, который теперь обновляется.

UPD: Кроме того, это работает для len() (__len__()), str() (__str__()), repr() (__repr__()) и многих подобных вещей.

Ответ 2

В словарях нет метода добавления. Вы можете добавить пару ключ-значение, как это:

{% do data['location']=node.location %} 

или

{% do data.update({'location': node.location}) %}

Ответ 3

Ключевые вынос:

  • Словарь
  • не поддерживает append().
  • Вы можете добавить новый элемент в словарь данных, используя тег {% do ... %}, как показано ниже:

    {% do data.update({'location': node.location}) %}
    
  • Однако для правильной работы тега "do" вам нужно добавить расширение jinja2.ext.do в среду jinja.

Ответ 4

Без расширения do:

{%- set _ = dict.update({c.name: c}) -%}

Работает в базе Jinja2 на Python 3, где решения __setitem__ дают мне:

access to attribute '__setitem__' of 'dict' object is unsafe