使用必须与ox oy轴标题对应的数据生成HTML表

时间:2015-01-22 20:40:48

标签: javascript python html

有没有办法我可以轻松生成一个带有水平标题(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;但到目前为止我找不到答案,而且我的代码很多都会产生不适当的结果(在它们的十字准线中对应的行和列标题有错误的状态)

1 个答案:

答案 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>