问题描述
我很抱歉,如果这看起来很简单,我已经待了好几个小时,无法一生解决这个问题。
要求:
我正在尝试使用sql表中的日期填充表并创建动态PDF
但是我最大的努力只能让我到这里:
(请参阅9月12日的重复值,该值应输入col2)
我选择将sql表填充到看起来像这样的字典中
cal_dict = {'12 Sept 2020' : 'Event_1','15 Sept 2020' : None,'22 Sept 2020' : 'Closed'}
现在在我的Jinja2模板中,每当出现“ Closed”字样时,我都需要使用<del></del>
标签来删除一些文本。
现在,如果我用我的字典填充jinja2 flask模板,它就会像这样出现
<div class="container-fluid">
<table class="table table-sm">
<tbody>
{% for k,v in cal_dict.items() %}
{% if v == 'Closed' %}
<tr>
<td><del>{{ k }} </del></td>
{% elif v == None %}
<td><del>{{ k }} </del></td>
{% else %}
<td> {{ k + '- ' + v }}
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
对于所有强度和目的来说,它都很好用,但是我的问题是我的字典很大,因此我想将该字典平均分为4列,因此我像这样创建了另一个嵌套字典
cal_dict_nest = {0 :{'12 Sept 2020' : 'Event 1','22 Sept 2020' : 'Closed'},1 : {'22 Oct 2020' : 'Event 2','31 Dec 2020' : 'Closed','05 Jan 2021' : 'Event 3'} }
然后我以这种方式手动调用每个外键(0、1、2、3):
我意识到四个for循环是一种非常糟糕的处理方式,但我想不出另一种方式来执行此操作,外键的单个循环然后内键的单个循环使我获得的不是四列。 / p>
<div class="container-fluid">
<table class="table table-sm">
<tbody>
{% for k,v in cal_dict[0].items() %}
{% if v == 'Closed' %}
<tr>
<td><del>{{ k }} </del></td>
{% elif v == None %}
<td><del>{{ k }} </del></td>
{% else %}
<td> {{ k + '- ' + v }}
{% endif %}
{% endfor %}
</tr>
{% for k,v in cal_dict[1].items() %}
{% if v == 'Closed' %}
<tr>
<td><del>{{ k }} </del></td>
{% elif v == None %}
<td><del>{{ k }} </del></td>
{% else %}
<td> {{ k + '- ' + v }}
{% endif %}
{% endfor %}
</tr>
</tbody>
</table>
</div>
解决方法
您可以使用jinja提供的batch
过滤器。这是一个内部构建的过滤器,可从可迭代项中生成批量列表,非常适合您的用例。
<div class="container-fluid">
<table class="table table-sm">
<tbody>
{% for row in cal_dict.items()|batch(4) %}
<tr>
{% for k,v in row %}
{% if v == 'Closed' or v is None %}
<td><del>{{ k }}</del></td>
{% else %}
<td>{{ k + '- ' + v }}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>