109

I just want to loop through an existing list and make a comma delimited string out of it.
Something like this: my_string = 'stuff, stuff, stuff, stuff'

I already know about loop.last, I just need to know how to make the third line in my code below WORK.

{% set my_string = '' %}
{% for stuff in stuffs %}
{% set my_string = my_string + stuff + ', '%}
{% endfor%}
mechanical_meat
  • 163,903
  • 24
  • 228
  • 223
KacieHouser
  • 1,885
  • 4
  • 22
  • 35
  • OK that original code I posted works, I had it in {{}} in my actual code instead of {%%} I have been searching and searching on the best way to approach it and the things available to me to do it, and that was at the end of the day into the night, so that {{}} slipped through in my frustration. Thank you for the response though – KacieHouser Jan 14 '10 at 14:52

6 Answers6

177

If stuffs is a list of strings, just this would work:

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

See join filter documentation, as well as filters in general documentation.

p.s.

More reader friendly way

{{ my ~ ', ' ~ string }}
Parzival
  • 2,051
  • 4
  • 14
  • 32
mechanical_meat
  • 163,903
  • 24
  • 228
  • 223
  • 31
    remember to use ~ instead of + [like said here](http://jinja.pocoo.org/docs/templates/#other-operators) – Josmar Dec 01 '12 at 16:57
88

You can use + if you know all the values are strings. Jinja also provides the ~ operator, which will ensure all values are converted to string first.

{% set my_string = my_string ~ stuff ~ ', '%}
davidism
  • 121,510
  • 29
  • 395
  • 339
Dag Wieers
  • 1,663
  • 13
  • 11
12

My bad, in trying to simplify it, I went too far, actually stuffs is a record of all kinds of info, I just want the id in it.

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

I want my_sting to be

my_sting = '123, 456'

My original code should have looked like this:

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

Thinking about it, stuffs is probably a dictionary, but you get the gist.

Yes I found the join filter, and was going to approach it like this:

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

But the append doesn't work without importing the extensions to do it, and reading that documentation gave me a headache. It doesn't explicitly say where to import it from or even where you would put the import statement, so I figured finding a way to concat would be the lesser of the two evils.

slm
  • 15,396
  • 12
  • 109
  • 124
KacieHouser
  • 1,885
  • 4
  • 22
  • 35
  • 8
    Since 2.6 you can select an attribute in the join filter. So you could do {{ stuffs.join(', ', attribute='id') }} see http://jinja.pocoo.org/docs/templates/#join – dmertl Feb 12 '14 at 01:08
9

If you can't just use filter join but need to perform some operations on the array's entry:

{% for entry in array %}
User {{ entry.attribute1 }} has id {{ entry.attribute2 }}
{% if not loop.last %}, {% endif %}
{% endfor %}
Kuba
  • 372
  • 4
  • 8
2

Just another hack can be like this.

I have Array of strings which I need to concatenate. So I added that array into dictionary and then used it inside for loop which worked.

{% set dict1 = {'e':''} %}
{% for i in list1 %}
{% if dict1.update({'e':dict1.e+":"+i+"/"+i}) %} {% endif %}
{% endfor %}
{% set layer_string = dict1['e'] %}
Kapil
  • 193
  • 2
  • 14
  • this is awesome and avoids extra `None` when the code is part of the flask app template. – D_K May 28 '19 at 13:33
0

You have to use the join method to concatenate strings and variables. Here is an example of how to do that.

{% set module = "XYZ" %}
{% set jarfile = [module, '-', version, '-jar-with-dependencies.jar']|join %}
Vipul Sharda
  • 387
  • 3
  • 6