jinja2 flask:迭代时使用rowspan两次

时间:2017-03-10 01:38:37

标签: python html flask jinja2

我将以下列表通过烧瓶传递给Jinja2模板:

yrs = [2016, 2017]
months = [['June'], ['January', 'February']]
names = [[['John', 'Mike']], [['Sara'], ['Steph', 'James']]]

我试图制作一个如下所示的表格:https://jsfiddle.net/46qqfef5/4/

以下是我为实现这一目标而制定的不成功的Jinja2代码:

<div class="table-responsive">
  <table class="table table-bordered">
    <thead>
      <tr>
        <th>Year</th>
        <th>Month</th>
        <th>Name</th>
      </tr>
    </thead>
    <tbody>
      {% for yr_index in range(yrs | count) %}
        {% for month_index in range(months[yr_index] | count) %}
          {% for name_index in range(names[yr_index][month_index] | count) %}
            <tr>
              {% if loop.first %}
                {% if loop.first %}
                  <td rowspan="{{ names[yr_index] | count }}">{{ yrs[yrs_index] }}</td>
                {% endif %}
              <td rowspan="{{ names[yr_index][month_index] | count }}">{{ months[yr_index][month_index] }}</td>
              {% endif %}
              <td>{{ names[yr_index][month_index][name_index] }}</td>
            </tr>
        {% endfor %}
      {% endfor %}
    </tbody>
  </table>
<div>

所以我基本上只是尝试将这些列表解压缩到一个有组织的表格中,但我在rowspan属性上遇到了很多麻烦。任何提示都会非常感激,即使它与更改python列表的结构有关。

1 个答案:

答案 0 :(得分:1)

首先尝试这个(没有测试)。你似乎误用了loop.first(你有嵌套循环,实际上你不能依赖loop.first)。并且您还需要在检索计数之前展平names[yr_index]列表。

请仔细阅读:http://jinja.pocoo.org/docs/dev/tricks/#accessing-the-parent-loop

<div class="table-responsive">
  <table class="table table-bordered">
    <thead>
      <tr>
        <th>Year</th>
        <th>Month</th>
        <th>Name</th>
      </tr>
    </thead>
    <tbody>
      {% for yr in yrs %}
        {% set yr_loop = loop %}
        {% for month in months[loop.index0] %}
          {% set month_loop = loop %}
          {% for name in names[yr_loop.index0][loop.index0] %}
            <tr>
              {% if loop.first %}
                {% if month_loop.first %}
                  <td rowspan="{{ names[yr_loop.index0]|sum(start=[])|count }}">{{ yr }}</td>
                {% endif %}
                <td rowspan="{{ loop.length }}">{{ month }}</td>
              {% endif %}
              <td>{{ name }}</td>
            </tr>
        {% endfor %}
      {% endfor %}
    </tbody>
  </table>
<div>