Шаблоны Jinja2, удалите возврат каретки

#python #jinja2

Вопрос:

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

Сценарий Jinja2, который я использую, выглядит следующим образом

 {% for name in names -%}
{{name}} OR 
{% endfor -%}
 

Это дает мне

 name1 OR
name2 OR
name3 OR
 

что в тексте я делаю так, чтобы это выглядело так, как будто мне нужно «имя 1, ИЛИ имя 2, ИЛИ имя 3, ИЛИ» затем «имя 1, ИЛИ имя 2, ИЛИ имя 3».

Я пытаюсь исследовать создание Jinja2, который приблизит меня к окончательному формату, который мне нужен.

Мог бы кто-нибудь помочь мне в этом, я был бы очень признателен.

Комментарии:

1. Так ты хочешь этого трейлинга OR или нет? Это не совсем ясно из вашего вопроса.

Ответ №1:

Вы можете использовать loop.last для предотвращения вывода ИЛИ в рамках последней итерации и использовать - для удаления возвратов каретки.

 {% for name in names -%}
{{name}}{{ " OR " if not loop.last else "" -}}
{% endfor -%}
 

Ответ №2:

Вам нужно использовать {%- тег as start, чтобы удалить пробелы для предыдущего выражения:

 from jinja2 import Template

template = '''
{% for name in names -%}
{{name}} OR
{%- endfor -%}
'''
print (Template(template).render(names=['a', 'b', 'c']))
 

Это возвращает следующее, что, вероятно, не то, что вы на самом деле хотели.. 🙂

 <newline>
a ORb ORc OR
 

Таким образом, чтобы получить желаемый результат, существует по крайней мере два следующих варианта шаблона:

 {{ names | join(' OR ') }}
 

или даже более короткий вариант:

 {{ " OR ".join(names) }}