在jinja2模板烧瓶中的n个列的引导程序中拆分嵌套字典

问题描述

我很抱歉,如果这看起来很简单,我已经待了好几个小时,无法一生解决这个问题。

要求:

我正在尝试使用sql表中的日期填充表并创建动态PDF

图片中,我正在尝试获取图片

enter image description here

但是我最大的努力只能让我到这里:

enter image description here

(请参阅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>