2017-02-02 58 views
0

比方說,我有以下兩個列表:使用行跨度,而迭代

names = ['Josh', 'Brad', 'Jordan'] 
favorite_colors = [['blue', 'red'], ['purple', 'gold', 'yellow'], ['green', 'pink']] 

也就是說,喬什最喜歡的顏色是藍色和紅色,布拉德的是紫色和金等

我m通過燒瓶將這些數據傳遞給jinja2模板,我正在將它們全部扔在桌子上。我想讓桌子看起來像這樣:https://jsfiddle.net/46qqfef5/

正如你所看到的,我使用rowspan屬性來指定組名和顏色。但是,當我嘗試使用下面的jinja2代碼迭代數據時,<td rowspan="2">標記出現在每行(並且我需要它僅在第一次出現新名稱時出現)。

的Jinja2:

<div class="table-responsive"> 
    <table class="table table-bordered table-hover"> 
    <thead> 
     <tr> 
     <th>Name</th> 
     <th>Favorite Color</th> 
     </tr> 
    </thead> 
    <tbody> 
     {% for name_index in range(names | count) %} 
     {% for color_index in range(favorite_colors[name_index] | count %} 
      <tr> 
      <td rowspan="{{ favorite_colors[name_index] | count }}">{{ names[name_index] }}</td> 
      <td>{{ favorite_colors[name_index][color_index] }}</td> 
      </tr> 
     {% endfor %} 
     {% endfor %} 
    </tbody> 
    </table> 
<div 

如果我從Jinja2的代碼中刪除rowspan={{ ... }}上面我得到如下表,但看起來很可怕對我說:https://jsfiddle.net/46qqfef5/3/

我需要一種方法來打印姓名小區只有第一次出現一個新名字。

回答

3

您可以使用special loop variables來檢查當前循環是否在第一位。在你的情況下,可以使用loop.first

<table> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Favorite Color</th> 
    </tr> 
    </thead> 
    <tbody> 
    {% for name_index in range(names | count) %} 
    {% for color in favorite_colors[name_index] %} 
    <tr> 
     {% if loop.first %} 
     <td rowspan="{{ favorite_colors[name_index] | count }}"> 
     {{ names[name_index] }} 
     </td> 
     {% endif %} 
     <td>{{ color }}</td> 
    </tr> 
    {% endfor %} 
    {% endfor %} 
    </tbody> 
</table>