使用Yattag创建新TR的HTML表

2024-09-28 22:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用yattag创建HTML,在我的代码中,我希望循环数据库记录,并动态地创建HTML表。在

例如,如果中的div数为5:

with tag('table', klass='all-pr'):
        with tag('tr'):
            with tag('td'):
                for zone in all_zones:
                    clear += 1
                    with tag('div', klass='pr' + ' ' + risk_alert):
                        text(zone['name'])
                    with tag('div', klass='link-pr'):
                        text('-')
                    if (clear % 5 == 0):
                        # create a new <tr>

更新: 好的,我期望的html是:

^{pr2}$

CSS的(部分):

.link-pk, .pr {
    text-align: center;
    float: left;
    margin-top: 5px;
    padding: 5px;
    width : 25px
}

然后,我用PDFKIT库将HTML转换成PDF格式。在

但我不知道如何关闭一个标记并(重新)创建一个新的,然后继续循环。。。 有什么想法吗?在

谢谢, F


Tags: 代码textdiv数据库zonehtmltagwith
1条回答
网友
1楼 · 发布于 2024-09-28 22:29:00

所以问题不在于Yattag,对吧?你的问题是把元素分成5组(或任何固定的数字)。 为此,我将使用itertools模块中的islice方法。在

您有一个示例,说明如何使用此函数创建一个take函数,该函数接受iterable的第一个n元素:

https://docs.python.org/3/library/itertools.html#itertools-recipes

使用这个take函数,您可以按一组n元素使用iterable。以下是解决您特定问题的方法:

from itertools import islice
from yattag import Doc, indent

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

def zones_to_html(zones):
    zones_iterator = iter(zones) # in case zones is not already an iterator
    doc, tag, text, line = Doc().ttl()
    with tag('table', klass="all-pr"):
        while True:
            first5 = take(5, zones_iterator)
            if len(first5) == 0:
                break
            else:
                with tag('tr'):
                    with tag('td'):
                        for zone in first5:
                            line('div', zone['name'], klass = 'pr ' + zone['risk_alert'])
                            line('div', '-', klass='link-pr')
    return doc.getvalue()

# Example of use:
if __name__ == '__main__':
    all_zones = ({'name': i, 'risk_alert': 'high'} for i in range(114, 129))
    print(indent(zones_to_html(all_zones)))

我使用了Yattag的line方法,这是这里描述的一个快捷方式:http://www.yattag.org/#shortcut-for-nodes-that-contain-only-text

相关问题 更多 >