jinja2:通过迭代列而不是跨行来构建表

时间:2017-04-10 23:09:54

标签: python jinja2

如果我有以下清单:

headers = ['Name', 'Age']
rows = [['Johnny', 30], ['Zack', 20]]

我可以通过Jinja2(https://jsfiddle.net/equbh9du/1/)轻松制作一张桌子:

<table class="table table-bordered table-hover">
  <thead>
    <tr>
      {% for h in headers %}
        <td>{{ h }}</td>
      {% endfor %
    </tr>
  </thead>
  <tbody>
    {% for row in rows %}
      <tr>
        {% for item in row %}
          <td>{{ item }}</td>
        {% endfor %}
      </tr>
    {% endfor %}
  </tbody>
</table>

我注意到将数据作为字典返回会更容易(也更有条理):

d = {'Name': ['Johnny', 'Zack'], 'Age': [30, 20]}

有没有一种简单的方法来构建我使用此dict构建的表。我想我需要在继续下一列之前完成每列的迭代(在上面的例子中,我在继续下一行之前完成每行的迭代)。

这是我到目前为止的代码,但我得到了一张混乱的表(https://jsfiddle.net/j164fqy9/1/):

<table class="table table-bordered table-hover">
  <thead>
    <tr>
      {% for h in d %}
        <td>{{ h }}</td>
      {% endfor %
    </tr>
  </thead>
  <tbody>
    {% for h, col_values in d.items() %}
      {% for item in col_values %}
        <tr>
          <td>{{ item }}</td>
        </tr>
      {% endfor %}
    {% endfor %}
  </tbody>
</table>

编辑:如果HTML标准阻止首先迭代列,那么我需要从headers构建rowsd。低于最好的方法吗?

headers = [h for h in d]
rows = [[l[i] for h, l in d.items()] for i in range(len(d['Name']))]

1 个答案:

答案 0 :(得分:1)

如果你总是在col_values中拥有相同数量的项目,这应该可以正常工作:

{% for i in range(d['Name']|count) %}
    <tr>
        {% for k in d %}
            <td>{{ d[k][i] }}</td>
        {% endfor %}
    </tr>
{% endfor %}