有没有办法我可以轻松生成一个带有水平标题(1row)和垂直标题(第1列)的html表格,其中包含提供的对象列表,即表格中插入的数据:
container.name = 'whirlpool' #unique set of attr for all objs makes the 1st row
container.version = '8.1' # gather a set of this to form headers (1st column)
container.status = 'FAILED' # this is put inside the formed grid into corresponding cell, if no such cell, we provide default 'not tested'
所以,如果我们有t.name =' whirlpool'作为容器,它会查找所有对象与它形成一行:
8.1 8 7
Whirlpool FAILED PASS <not tested>
Keccak <not tested> PASS PASS
我认为我过度工程,我试图包装这种功能。因为我先写了很多代码 a)遍历所有容器对象的循环以形成一组名称 b)遍历所有容器对象的循环以形成一组版本 c)开始获取容器名称,以查看它已经过测试的版本,并形成一个列表,稍后将其插入到模板HTML中。
我认为这是一个非常普遍的问题,想要拥有这样一个结果表&#39;但到目前为止我找不到答案,而且我的代码很多都会产生不适当的结果(在它们的十字准线中对应的行和列标题有错误的状态)
答案 0 :(得分:0)
事实上,解决方案非常简单:
为了创建使用包含三个实体的值生成的类似excel的表:header ox,header oy,result,你只需:
1)为oy和ox形成唯一的标题:
ox_headers = sorted(list(set([report.version for report in reports])
oy_headers = sorted(list(set([report.sample_name for report in reports])
2)迭代我们的唯一标题以形成html_grid:
data_to_html_sample = []
for oy_header in oy_headers:
ox_row = [oy_header]
for ox_header in ox_headers:
ox_row.append(next((report.result for report in reports if (report.name == oy_header and report.build == ox_header)), "< not tested >"))
data_to_html_sample.append(ox_row)
3)现在我们有一个与我们的标题对应的行列表,我们使用Jinja2作为我们的模板工具:
import jinja2
from jinja2 import Environment, PackageLoader
template_dir = os.path.join(os.path.dirname(__file__), "templates")
env = Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True)
template = env.get_template('table_results.html')
output = template.render(ox = ox_headers oy = oy_headers, data = data_to_html)
with open("results.html", "wb") as fh:
fh.write(output)
模板文件夹中的Jinja2模板如下所示:
<table class="tg">
<tr>
<th class="tg-031e"> Name / Version <br></th>
{% for item in ox %}
<th class = "th-031e">{{item}}<br></th>
{% endfor %}
</tr>
{% for row in data %}
<tr>
{% for item in row %}
<th class = "th-031e">{{item}}<br></th>
{% endfor %}
</tr>
{% endfor %}
</table>