Jinja циклы

Давайте рассмотрим 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

Стоит помнить, что в цикл мы передаем только итерируемые объекты!

Рейтинг
( 1 оценка, среднее 2 из 5 )
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: