我使用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是:
<table class="all-pr" >
<tr>
<td>
<div class="pr risk-alert-high">114</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">115</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">116</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">117</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">118</div>
<div class="link-pr">-</div>
</td>
</tr>
<!-- BREAK HERE -->
<tr>
<td>
<div class="pr risk-alert-high">119</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">120</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">121</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">122</div>
<div class="link-pr">-</div>
<div class="pr risk-alert-high">123</div>
<div class="link-pr">-</div>
</td>
</tr>
...
...
</table> CSS的(部分):
.link-pk, .pr {
text-align: center;
float: left;
margin-top: 5px;
padding: 5px;
width : 25px
}然后,我使用PDFKIT lib将HTML转换为PDF格式。
但我不知道如何关闭一个标签并(重新)创建一个新标签,然后继续循环……有什么想法吗?
谢谢,F。
发布于 2018-06-19 23:32:49
所以问题并不是关于Yattag的,对吧?你的问题是以5个元素为一组(或任何固定的数字)。为此,我将使用itertools模块中的islice方法。
您有一个示例,说明如何使用此函数创建一个take函数,该函数接受可迭代对象的第一个n元素:
https://docs.python.org/3/library/itertools.html#itertools-recipes
使用这个take函数,您可以使用一组n元素来迭代。以下是针对您的特定问题的解决方案:
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
https://stackoverflow.com/questions/50928679
复制相似问题