Давайте рассмотрим jinja циклы, а именно блок for, который позволяет фотмировать список на основе любого итерируемого объекта, например, списков. Вот здесь вы найдете все о списках, методы списков в Python, а также сможете проверить свои знания пройдя тест списки в Python.
Ну, а саму документацию вы найдете здесь: https://jinja.palletsprojects.com/en/2.11.x/
Синтаксис блока for в Jinja
{% for <выражение> -%}
<повторяемый фрагмент>
{% endfor %}
Давайте рассмотрим пример, есть у нас некий список, элементами которого являются словари:
person = [{'id': 1, 'name': 'Олег'},
{'id': 2, 'name': 'Иван'},
{'id': 3, 'name': 'Анна'},
{'id': 4, 'name': 'Сергей'},
{'id': 5, 'name': 'Екатерина'}]
Давайте отобразим эти элементы на странице:
from jinja2 import Template
link = '''<select name="person">
{% for p in person -%}
<option value="{{p['id']}}">{{p['name']}}</option>
{% endfor -%}
</select>'''
tm = Template(link)
msg = tm.render(person=person)
print(msg)
В цикл мы передаем наш список person, в самом цикле получаем каждый элемент списка в переменной p, это все находится в многостроковом коментарии, что бы потом его переменную link передать в класс Template для создания объекта. После чего, эту строку передаем в класс Template, создав таким образом объект класса, и у него вызываем метод render, которому также передаем наш список person.
Двойные фигурные скобки нам нужны для того, что внутрь их передать значение переменной: {{p[‘id’]}} — отображаем id с базы данных, {{p[‘name’]}} — отображаем имя.
Вот где нам нужны jinja циклы — для отображения элементов списков контента на страницах сайта, и таким образом вы можете отображать абсолютно все итерируемые объекты, не только циклы, но и tuple, dictionary, и другие.
Блок if — else в Jinja
На том же примере, person в блоке for:
link = '''<select name="person">
{% for p in person -%}
{% if p.id > 3 -%}
<option value="{{p['id']}}">{{p['name']}}</option>
{% endif -%}
{% endfor -%}
</select>'''
Внутрь цикла мы добавили блок if-else. Работает он точно также, как и в других частях пайтон-кода, единственное что, не забывает включать его в фигурные скобки {} и писать блок {% endif %}
Также, в блоке if конечно же можно исспользовать конструкцию else, выглядит это так:
link = '''<select name="person">
{% for p in person -%}
{% if p.id > 3 -%}
<option value="{{p['id']}}">{{p['name']}}</option>
{% else -%}
{{p['name']}}
{% endif -%}
{% endfor -%}
</select>'''
Конечно же, блок {% else %} выполнится в том случае, если условие в if будет ложным.
Блоки if — elif — else в Jinja
Ну, и на последок скажем о блоке {% elif p.name == ‘Иван’ %}
from jinja2 import Template
person = [{'id': 1, 'name': 'Олег'},
{'id': 2, 'name': 'Иван'},
{'id': 3, 'name': 'Анна'},
{'id': 4, 'name': 'Сергей'},
{'id': 5, 'name': 'Екатерина'}]
link = '''
{% for p in person -%}
{% if p.id > 3 -%}
<option value="{{p['id']}}">{{p['name']}}</option>
{% elif p.name == 'Иван' -%}
<option value="{{p['id']}}">{{p['name']}}</option>
{%- else -%}
{{p['name']}}
{% endif -%}
{% endfor -%}
'''
tm = Template(link)
msg = tm.render(person=person)
print(msg)
#Результат получим
#Олег
#<option value="2">Иван</option>Анна
#<option value="4">Сергей</option>
#<option value="5">Екатерина</option>
Итак, подведем итог:
- Мы разобрали Jinja циклы, синтаксис их, и как с ними работать
- Также рассмотрели блоки if-elif-else в Jinja
Стоит помнить, что в цикл мы передаем только итерируемые объекты!