2017-04-10 180 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語法 –