我试图从存储在表中的数据创建HTML表。我的数据是从表中读取并转换为列表的字典,例如:
x = {'date':[u'2012-06-28', u'2012-06-29', u'2012-06-30'], 'users': [405, 368, 119]}
我的目标是为任意列表长度创建具有以下结构的HTML表:
<table> <thead> <th>Date</th> <th>Users</th> </thead> <tbody> <tr> <td>2012-06-28</td> <td>405</td> </tr> <tr> <td>2012-06-29</td> <td>368</td> </tr> <tr> <td>2012-06-30</td> <td>119</td> </tr> </tbody> </table>
我尝试在Flask模板中执行以下两种不正确的方法:
<tbody> {% for line in x %} <tr> <td>{{ x.date|tojson|safe }}</td> <td>{{ x.users }}</td> </tr> {% endfor %} </tbody>
它将整个列表打印到每一列中。
和:
{% for date in x.date %} <tr><td>{{ date|tojson|safe }}</td></tr> {% endfor %} {% for users in x.users %} <tr><td>{{ users }}</td></tr> {% endfor %}
它将所有内容简单地打印到第一列中。
这些实验和许多其他死胡同使我相信,没有什么简单的方法可以构建表,就像我想要的当前数据结构一样。
鉴于此,我有两个问题: 1)我将如何使用当前数据结构构建表? 2)此用例的数据结构的标准或理想方式是什么?
提前致谢。
如你所说,你可以更改数据结构,也可以更改模板代码。这是保持当前结构的一种方法:
{% for row_index in range(x['date']|count) %} <tr> <td>{{ x['date'][row_index]|tojson|safe }}</td> <td>{{ x['users'][row_index] }}</td> </tr> {% endfor %}
或者你可以在python中重组数据:
x = zip(x['date'], x['users'])
然后使用此模板:
{% for row in x %} <tr> <td>{{ row[0]|tojson|safe }}</td> <td>{{ row[1] }}</td> </tr> {% endfor %}
你还可以对数据进行结构化,以使模板不依赖于单元格的顺序:
from itertools import izip x = [dict(date=d, user=u) for d, u in izip(x['date'], x['users'])]
然后,你可以像这样访问数据:
{% for row in x %} <tr> <td>{{ row['date']|tojson|safe }}</td> <td>{{ row['user'] }}</td> </tr> {% endfor %}