【问题标题】:split a nested dictionary in jinja2 template flask in bootstrap over n number of columns在引导程序中将 jinja2 模板烧瓶中的嵌套字典拆分为 n 列
【发布时间】:2020-12-26 07:54:24
【问题描述】:

如果这看起来很简单,我深表歉意,我已经研究了几个小时,但我终生无法弄清楚。

要求:

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

在图片中我试图获得这个:

但我最好的尝试只会让我来到这里:

(请参阅应进入 col2 的重复值 12 Sept)

我选择将我的 sql 表填充到一个看起来像这样的字典中

cal_dict = {'12 Sept 2020' : 'Event_1', '15 Sept 2020' : None, '22 Sept 2020' : 'Closed'}

现在在我的 Jinja2 模板中,每当出现“已关闭”一词时,我都需要使用 <del></del> 标记删除一些文本。

现在如果我用我的字典填充我的 jinja2 烧瓶模板,它就会像这样

<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):

我意识到四个 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 有一个特殊的内部构建过滤器,用于批量处理迭代。您不必使用嵌套字典来实现 4 列表。您可以使用batch 过滤器从您的字典中抓取每4 个项目,然后生成表格的每一行。在提供的链接中,有一个在表格上下文中使用过滤器的绝佳示例。
  • @Scratch'N'Purr 你是我的英雄,说真的,我花了一整天的时间试图重新创建这个函数的逻辑。如果可能的话,你能把这个作为答案发布吗?
  • 很高兴我能帮上忙!并完成:)

标签: python twitter-bootstrap flask jinja2


【解决方案1】:

您可以使用 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>

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多