jinja2 - цикл по словарю - PullRequest
0 голосов
/ 04 марта 2019

Я новичок с Jinja2, возможно, мой вопрос нуби, но я не могу его понять.

Поэтому я использую Jinja2 для задачи Ansible в качестве шаблона для создания файла, яУ меня есть словарь, определенный в файле переменных по умолчанию, например:

test123:
  testA:
    name: test1
    number: 1
    path: /tmp/test.txt
  testB:
    name: test2
    number: 2
    path: /tmp/test.txt

Теперь в моем файле Jinja2 я хочу просмотреть этот словарь и напечатать все, что определено в словаре.

Я пробовал разные примеры, но ничего не получается.

Например:

{% for item in test123.values() -%}
{{ item.name }}="{{ item.number }}"
{%- endfor %} 
{% for item in test123.testB.values() -%}
    {{ item.name }}="{{ item.number }}"
{%- endfor %} 

Сообщение об ошибке:

неустранимо: [testserver]: FAILED!=> {"change": false, "msg": "AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode object' не имеет атрибута 'name'"}

Я думаю, может быть, лучшебыло бы создать цикл while для этого и распечатать все, но поскольку в Jinja2 нет цикла while, я немного запутался, как это сделать.

У кого-нибудь есть идеи, как этого добиться?Итак, еще раз цель состоит в том, чтобы напечатать все из словаря в файле Jinja2.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Можно использовать фильтр dict2items .Шаблон ниже

{% for item in test123|dict2items %}                                                
{{ item }}                                                                          
{% endfor %}

{% for item in test123|dict2items %}
key: {{ item.key }}
value.number: {{ item.value.number }}
value.name: {{ item.value.name }}
value.path: {{ item.value.path }}

{% endfor %}

дает

{'value': {u'path': u'/tmp/test.txt', u'name': u'test1', u'number': 1}, 'key': u'testA'}
{'value': {u'path': u'/tmp/test.txt', u'name': u'test2', u'number': 2}, 'key': u'testB'}

key: testA
value.number: 1
value.name: test1
value.path: /tmp/test.txt

key: testB
value.number: 2
value.name: test2
value.path: /tmp/test.txt
0 голосов
/ 04 марта 2019

Приведенный ниже будет создавать выход со всеми именами пользователей в нем

{% for item in test123.values() %}
name of the user: {{ item.name }}
{% endfor %}

Формат вывода:

name of the user: test1
name of the user: test2

Если вам нужно что-то в определенном формате, дайте мне знать желаемый вывод

0 голосов
/ 04 марта 2019

Это не словарь Python.однако, если вы получили список диктов:

test123 = [
    {'name':'test1', 'number': 1, 'path': '/tmp/test.txt'},
    {'name':'test2', 'number': 2, 'path': '/tmp/test.txt'},
    ]

этот код jinja должен работать:

{% for item in test123 %}
    {{ item.name }}="{{ item.number }}"
{% endfor %}

конечно, вам нужно передать этот диктов в вашу функцию рендеринга (вы не публикуетекод вашего контроллера).Не знаю, хорошо ли это относится к ansible.

...