将 bootstrap 中的 jinja2 模板烧瓶中的嵌套字典拆分为 n 列
split a nested dictionary in jinja2 template flask in bootstrap over n number of columns
很抱歉,如果这看起来很简单,我已经研究了好几个小时,但我终究无法弄明白。
要求:
我正在尝试使用 sql table 中的日期填充 table 并创建动态 PDF
在图片中,我试图获得这个:
但我最好的尝试只是让我来到这里:
(请参阅 9 月 12 日的重复值,它应该进入 col2)
我选择将 sql table 填充到字典中,大致如下所示
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', '15 Sept 2020' : None, '22 Sept 2020' : 'Closed'},
1 : {'22 Oct 2020' : 'Event 2', '31 Dec 2020' : 'Closed', '05 Jan 2021' : 'Event 3'} }
然后我像这样手动调用每个外键 (0,1,2,3) :
我意识到 4 个 for 循环是一种非常糟糕的做事方式,但我想不出其他的方式来做到这一点,外部键和内部键的单个循环使我得到一个列而不是 4 .
<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>
很抱歉,如果这看起来很简单,我已经研究了好几个小时,但我终究无法弄明白。
要求:
我正在尝试使用 sql table 中的日期填充 table 并创建动态 PDF
在图片中,我试图获得这个:
但我最好的尝试只是让我来到这里:
(请参阅 9 月 12 日的重复值,它应该进入 col2)
我选择将 sql table 填充到字典中,大致如下所示
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', '15 Sept 2020' : None, '22 Sept 2020' : 'Closed'},
1 : {'22 Oct 2020' : 'Event 2', '31 Dec 2020' : 'Closed', '05 Jan 2021' : 'Event 3'} }
然后我像这样手动调用每个外键 (0,1,2,3) :
我意识到 4 个 for 循环是一种非常糟糕的做事方式,但我想不出其他的方式来做到这一点,外部键和内部键的单个循环使我得到一个列而不是 4 .
<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>