Django模板中的条件计数器循环

Posted

技术标签:

【中文标题】Django模板中的条件计数器循环【英文标题】:Conditional Counter in Django template for loops 【发布时间】:2021-05-07 14:58:06 【问题描述】:

我希望我的 for 循环在 if 条件满足三次后结束,同时在我的电子商务网站中呈现我的“产品”详细信息。

category.html

    % for item in subcategory %
    % with counter="0" %
    <div>
        <h5 class="my-0" style="font-weight: 700;"> item.title </h3>
    </div>
    <div class="row">
        % for i in products %
        % if i.category.id == item.id %
         counter|add:"1" 
        % if counter == "3" %
             break
        % endif %
        <div class="col-3 p-0 px-1 my-3">
            <a href="% url 'product_detail' i.id i.slug %">
                <img class="w-100" id="catbox" src=" i.image.url " >
            </a>
        </div>
        % endif %
        % endfor %
        <div class="col-3 p-0 my-3   text-center"
            style="border-radius: 10px;background: url(% static 'images/temp.jpeg' %); background-size: cover;">
            <div class="h-100 w-100 m-0 p-0" style="background: rgba(0, 0, 0, 0.61);border-radius: 10px;">
                <div style="position: relative;top: 50%;transform: translateY(-50%);">
                    <a href="% url 'category_product' item.id item.slug %" class="text-white " href="#"><strong>SEE
                            ALL</strong></a>
                </div>
            </div>
        </div>
    </div>
    % endwith %
    % endfor %

我希望第二个 for 循环,即 % for i in products %,一旦满足 if 条件,即其中的 % if i.category.id == item.id %,就中断 三次。但是我设置为 0 的计数器会重复递增到 1,而不是使用 for 循环重复递增。由于里面有一个 if 条件,我也不能使用 forloop.counter 。 我希望对第一个 for 循环的每次迭代重复此过程,即 % for item in subcategory %

【问题讨论】:

【参考方案1】:

不存在用于中断(或在 python 中继续)目的的模板标签。发送未经处理的数据并在模板中工作通常是一种不好的做法。我认为首先您需要根据视图中的条件制作一个列表,然后将其传递给模板以使用它们。 但是,你可以做一件事(在我看来效率很低),

% if counter <= 3 %
   do the job which you meant to do before breaking
% endif %

或者您可以尝试创建自己的模板标签/过滤器。但我建议你在模板中保持简单,在视图中弄乱它。 view docs for template tags

【讨论】:

还有如何声明和增加计数器? counter|add:"1" 将 1 加到 counter 并使其值从 0 到 1 重复,而不是随着 for 循环的迭代而不断增加 counter 的值。 对不起,我忘记了,通常情况下,你不能这样做。为此,您必须声明一个非常简单的自定义模板标签。在这里你会得到一个例子:see this【参考方案2】:

您不需要自己定义计数器并使用'with'标签。您可以使用 django 内置计数器进行循环。您可以像这样在 for 循环中访问计数器: forloop.counter 从 1 开始, forloop.counter0 从 0 开始。您还可以像这样访问外部 for 循环计数器的计数器:forloop.parentloop.counter/counter0 check @ 987654321@

【讨论】:

是的,我知道这个。但我有很多“产品”,其中,我只想展示 3 个满足上述 if 条件的产品。如果我使用 forloop.counter 它只会计算“产品”的数量,而不是满足 if 条件的“产品”数量。添加到它,我怎样才能打破 Django 模板中的 for 循环?

以上是关于Django模板中的条件计数器循环的主要内容,如果未能解决你的问题,请参考以下文章

django 模板中{%for%}的使用

Django模板:获取嵌套循环的总迭代次数

如何在 Django 模板中使用变量索引访问列表?

Django:如何在模板的 if 语句中使用变量?

Django - 一个计数器模板标签,即使使用嵌套的 for 标签也能很好地工作

Python中的循环和if语句