【问题标题】:Looping over items with Jinja, adding in div after every 5th item使用 Jinja 循环项目,每 5 个项目后添加 div
【发布时间】:2017-03-17 20:50:09
【问题描述】:

问题

我有一个包含 100 个高尔夫球场的列表,我希望插入一个 div,其中包含每五个球场之后的广告图片。我该怎么做呢?

更新 #1

content.html(修订,最新版本)

  • 由于 leovp 的原因,我已经更新了我的原始代码 sn-p 建议在下面编辑。我无法仅显示 {% if content.featured == "Test" %} 并且想知道如何关闭我的 if-else 语句。

        {% for content in COPY.courses %}
                <div class="course course--featured">
                    <a href=""><img src="" class="course__image image--region"></a>
    
                    <div class="course__inner">
                        <div class="course__wrapper">
                            {% if content.state == "MO" %}
                                <p class="course__state">Missouri</p>
                            {% elif content.state == "IL" %}
                                <p class="course__state">Missouri</p>
                            {% endif %}
                        </div>
    
                        <div class="course__wrapper">
                            <a href=""><p class="course__name name--region">{{ content.name }}</p></a>
                        </div>
                        <p class="course__desc">{{ content.description }}</p>
                    </div>
                </div>
    
        {% if loop.index % 5 == 0 %}
        <div class="advertising advertising--inline">
            <div class="ad ad--rect">
    
                <div class="text-center hidden-xs">
                    <div id="fixed-leaderboard-region-top"
                        class="dfp-ad"
                        data-dfp-custom-pos="fixed-leaderboard-top, htf"
                        data-dfp-size="[728,90]">
                    </div>
                </div>
    
                <div class="text-center hidden-sm hidden-md hidden-lg">
                    <div id="fixed-leaderboard-region-top-mobile"
                        class="dfp-ad"
                        data-dfp-custom-pos="fixed-leaderboard-top, htf"
                        data-dfp-size="[320,50]">
                    </div>
                </div>
            </div>
        </div>
        {% endif %}
        {% endfor %}
    </div>
    

content.html(以前的旧版本比较)

  • 我已经研究过使用 Stack Overflow question 中的 batch 看起来很相似,但我不确定这是否能解决我的问题?

    {% for content in COPY.courses %} {% if content.featured == "测试" %}

    <div class="course__inner">
        <div class="course__wrapper">
            {% if content.state == "MO"%}
            <p class="course__state">Missouri</p>
            {% elif content.state == "IL" %}
            <p class="course__state">Illinois</p>
            {% endif %}
        </div>
    
        <div class="course__wrapper">
            <a href=""><p class="course__name name--home">{{ content.name }}</p></a>
        </div>
        <p class="course__desc">{{ content.description }}</p>
    </div>
    

    {% endif %} {% endfor %}

【问题讨论】:

    标签: python loops jinja2


    【解决方案1】:

    在迭代时,你可以获取当前索引并检查它是否可以被 5 整除:

    {% set count = 0 %}
    {% for content in COPY.courses %}
    {% if content.featured == "Test" %}
    <div class="course course--featured">
        <a href=""><img src="" class="course__image image--home"></a>
        [...]
        </div>
    </div>
    
    {% set count = count + 1 %}
    {% if count % 5 == 0 %}
        <!-- additional content once every 5 courses -->
    {% endif %}
    {% endif %}
    {% endfor %}
    

    注意:此方法在 2.10 版之后不再有效。

    详情见: How to increment a variable on a for loop in jinja template?

    【讨论】:

    • 您的答案非常接近。使用您的解决方案,除非我在 {% if loop.index0 % 5 == 0 %} 之前关闭第一个 if 语句 {% if content.featured == "Test" %},否则我无法显示广告。但是现在,我看到所有 100 多门课程,当我想将其限制为具有 Test 的课程时
    • 我已更新原始答案以展示这些更改。
    • 啊。您需要在某些过滤条件后检查索引。我会更新答案。
    • 太棒了。是的,这行得通。我希望您可以在这里使用{% set count = 1 %}{% set count = count + 1 %} 来解释您的一些逻辑/推理
    • set count = 0 创建一个变量 count 并将其设置为 0。稍后,在 if 语句允许我们继续之后,我们增加 count 并检查它是否可以被 5 整除。如果是,那么我们就在第五个/第十个/ ... div之后。