【问题标题】:jinja2: building table by iterating down columns instead of across rowsjinja2:通过向下迭代列而不是跨行来构建表
【发布时间】:2017-04-13 00:14:04
【问题描述】:

如果我有以下列表:

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]}

有没有一种简单的方法可以使用这个字典来构建我在上面构建的表格。我想我需要在继续下一列之前完成每一列的迭代(在上面的示例中,我在继续下一行之前完成每一行的迭代)。

这是我到目前为止的代码,但我得到了一张乱七八糟的表 (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 标准首先阻止向下迭代列,那么我需要从 d 构造 headersrows。下面是执行此操作的最佳方法吗?

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

【问题讨论】:

标签: python jinja2


【解决方案1】:

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

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

【讨论】:

  • 这看起来不错!只是对第一行做了一个小的改动,它解释了正确的 jinja2 语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2020-07-22
  • 2021-12-11
  • 1970-01-01
  • 2017-03-25
  • 2015-09-08
相关资源
最近更新 更多