Конкатенация строк в Jinja

Я просто хочу перебрать существующий список и сделать из него строку с разделителями-запятыми.
Что-то вроде этого: my_string = 'stuff, stuff, stuff, stuff'

Я уже знаю о loop.last, мне просто нужно знать, как заставить третью строку в моем коде ниже РАБОТАТЬ.

{% set my_string = '' %}
{% for stuff in stuffs %}
{% set my_string = my_string + stuff + ', '%}
{% endfor%}

person KacieHouser    schedule 14.01.2010    source источник
comment
ОК, исходный код, который я опубликовал, работает, у меня он был в {{}} в моем фактическом коде вместо {%%}. Я искал и искал лучший способ приблизиться к нему и доступные мне для этого вещи, и это было в конце дня в ночь, так что {{}} ускользнуло от моего разочарования. Хотя спасибо за ответ   -  person KacieHouser    schedule 14.01.2010


Ответы (5)


Если stuffs - это список строк, сработает только это:

{{ stuffs|join(", ") }}

См. документацию по join filter, а также фильтры в общей документации.

p.s.

Более удобный для читателя способ

{{ my ~ ', ' ~ string }}
person mechanical_meat    schedule 14.01.2010
comment
не забудьте использовать ~ вместо + как сказано здесь - person Josmar; 01.12.2012

Вы можете использовать +, если знаете, что все значения являются строками. Jinja также предоставляет оператор ~, который гарантирует, что все значения сначала будут преобразованы в строку.

{% set my_string = my_string ~ stuff ~ ', '%}
person Dag Wieers    schedule 16.03.2019
comment
спасибо. Он также находится в документах jinja.palletsprojects.com/en/2.10.x/templates. /#математика - person keypress; 27.09.2019
comment
это должно быть принято! - person Nam G VU; 07.02.2021

Моя беда, пытаясь упростить это, я зашел слишком далеко, на самом деле stuffs - это запись всех видов информации, я просто хочу, чтобы в ней был идентификатор.

stuffs = [[123, first, last], [456, first, last]]

Я хочу, чтобы my_sting был

my_sting = '123, 456'

Мой исходный код должен был выглядеть так:

{% set my_string = '' %}
{% for stuff in stuffs %}
{% set my_string = my_string + stuff.id + ', '%}
{% endfor%}

Если подумать, stuffs, вероятно, это словарь, но суть вы поняли.

Да, я нашел фильтр join и собирался подойти к нему так:

 {% set my_string = [] %}
 {% for stuff in stuffs %}
 {% do my_string.append(stuff.id) %}
 {% endfor%}
 {%  my_string|join(', ') %}

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

person KacieHouser    schedule 14.01.2010
comment
Начиная с версии 2.6 вы можете выбрать атрибут в фильтре соединения. Таким образом, вы можете сделать {{ stuffs.join(', ', attribute='id') }} см. jinja.pocoo.org/docs/templates/#join - person dmertl; 12.02.2014

Если вы не можете просто использовать соединение с фильтром, но вам нужно выполнить некоторые операции над записью массива:

{% for entry in array %}
User {{ entry.attribute1 }} has id {{ entry.attribute2 }}
{% if not loop.last %}, {% endif %}
{% endfor %}
person Kuba    schedule 19.12.2017
comment
{% if not loop.last %}, {% endif %} -› идеально !! - person Jean Monet; 14.06.2021

Просто другой взлом может быть таким.

У меня есть массив строк, которые мне нужно объединить. Поэтому я добавил этот массив в словарь, а затем использовал его внутри цикла for, который сработал.

{% set dict1 = {'e':''} %}
{% for i in list1 %}
{% if dict1.update({'e':dict1.e+":"+i+"/"+i}) %} {% endif %}
{% endfor %}
{% set layer_string = dict1['e'] %}
person Kapil    schedule 19.07.2016
comment
это здорово и позволяет избежать дополнительных None, когда код является частью шаблона приложения фляги. - person D_K; 28.05.2019