2017-04-10 33 views
0

如果我有以下列表:的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]} 

Is there一个简单的方法来建立我使用这个字典上面建立的表。我想我需要在继续下一列之前完成每列的迭代(在上面的例子中,我完成了遍历每行的迭代,然后继续到下一行)。

这是代码我到目前为止,但我发现一个搞砸表(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标准的第一防止迭代下来列,那么我需要构造headersrows from d。低于最好的方式来做到这一点?

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

http://stackoverflow.com/questions/1285456/html-table-by-rows-or - 列 –

回答

1

如果你拥有百达在col_values相同数量的项目这应该很好地工作:

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

这看起来不错!只是对第一行进行了小小的改动,这个改写了适当的jinja2语法 –