asong91
asong91

Reputation: 417

How do you index on a jinja template?

I'm passing 3 lists to my jinja template through my python file.

list1 = [1,2,3,4]
list2 = ['a','b','c','d']
list3 = [5,6,7,8]

All these values correspond with eachother, so 1 matches with 'a' and 5, 2 with 'b' and 6, etc.

In my template I'm printing them out on the same line. How do I do numerical indexing to print them out? As so

1 a 5
2 b 6
3 c 7

The only thing I know is directly accessing the object through the loop like

 {%for item in list%}
    {{item}}

Upvotes: 37

Views: 100982

Answers (4)

Dhruv Arne
Dhruv Arne

Reputation: 133

Not directly but indirectly you can do list indexing

First of all convert the your list in string then pass in your jinja template

Second split that string into set(similar to list in list) in the jinja template by splitting it.

Then you can do simple indexing as you do in python lists.

{% set list1 = variable1.split(',') %}
The grass is {{ list1[0] }} and the boat is {{ list1[1] }}

or

{% set list1 = variable1.split(',') %}
{% for item in list1 %}
    <p>{{ item }}<p/>
{% endfor %} 

or

{% set item1, item2 = variable1.split(',') %}
The grass is {{ item1 }} and the boat is {{ item2 }}

Upvotes: 2

Alexander
Alexander

Reputation: 1743

Similar to @Sean Vieira answer, you can zip the data in your code, then index it in the template. For example:

data = zip(list1, list2, list3)

<table>
<tr>
       <td>list 1 value</td>
       <td>list 2 value</td>
       <td>list 3 value</td>        
<tr>
{% for row in data %}
<tr>
       <td>{{ row[0] }}</td>
       <td>{{ row[1] }}</td>
       <td>{{ row[2] }}</td>
</tr>
{% endfor %}
</table>

Upvotes: 4

Quentin Donnellan
Quentin Donnellan

Reputation: 2832

If you really want the index, you could just loop on one of the variables and then uses Jinja's loop.index0 feature (returns the current index of the loop starting at 0 (loop.index does the same thing, starting at 1)

For example:

{% for item in list1 %}

    {{ item }}
    {{ list2[loop.index0] }}
    {{ list3[loop.index0] }}

{% endfor %}

This assumes your lists are all asserted to be the same length before setting the template, or you'll encounter problems.

Upvotes: 51

Sean Vieira
Sean Vieira

Reputation: 159955

Two ways:

  1. In your code that calls Jinja simply zip your lists:

    data = zip(list1, list2, list3)
    # data is now a list of tuples
    # [(1, 'a', 5), (2, 'b', 6), etc.]
    

    Then, in your template you can simply loop over the nested rows:

    {# your_template.jinja #}
    <table>
    {% for row in data %}
        <tr>
        {% for cell in row %}
            <td>{{ cell }}</td>
        {% endfor %}
        </tr>
    {% endfor %}
    </table>
    
  2. As an alternate, if you only want to use Jinja you can use the special loop variable:

    <table>
    {% for cell in list1 %}
        <tr>
            <td>{{ list1[loop.index0] }}</td>
            <td>{{ list2[loop.index0] }}</td>
            <td>{{ list3[loop.index0] }}</td>
        </tr>
    {% endfor %}
    </table>
    

Upvotes: 10

Related Questions