Давайте рассмотрим 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
Стоит помнить, что в цикл мы передаем только итерируемые объекты!