5

我想在给定条件下在 django 模板中执行减少 forloop.counter 的值,在 django 中是否可能。

下面是演示示例

{% for i in item %}
    {% if forloop.counter0|divisibleby:4 %}
        Start
    {% endif %}
        {% if i %}
            item{{ forloop.counter }}
        {% else %}
            ######### Here I want to reduce value of forloop.counter by 1 ###########
        {% endif %}
    {% if forloop.counter|divisibleby:4 %}
        End
    {% endif %}

{% endfor %} 

在上面的代码中,8 个完美的项目输出将是

Start
item1
item2
item3
item4
End
Start
item5
item6
item7
item8
End

但假设 item2 为 None,则输出为

Start
item1 
item3
item4
End
Start
item5
item6
item7
item8
End

如果条件不满足,我想通过每次减少 forloop 的值以正确的升序形式打印它(每一步递增 1)。请不要建议自定义模板标签,我知道,我认为这是最后的选择。

4

4 回答 4

2

我真的怀疑 django 会让你forloop.counter轻易搞砸,而且无论如何也不会搞砸。显而易见的解决方案是在迭代之前过滤掉您的列表,这可以在您的视图中完成,或者(如果您坚持在模板中这样做)使用自定义过滤器。

或者您可以将列表包装在一个生成器函数中,该函数将负责过滤和编号,即:

def filteriternum(seq):
    num = 0
    for item in seq:
        if not item:
            continue
        num += 1
        yield num, item

再次在这里,您可以在视图中进行包装,也可以编写一个自定义的标签模板过滤器来进行包装。

于 2012-07-04T10:05:23.193 回答
1

也许是这样的:

{% for i in item %}
    {% cycle 'Start' '' '' '' %}
    {% if i %}
            item{{ forloop.counter }}
    {% else %}
            empty item{{ forloop.counter }}
    {% endif %}
    {% cycle '' '' '' 'End' %}
{% endfor %} 

这是输出:

Start
item1 
empty item2 
item3
item4
End 
Start
item5 
item6 
item7 
item8
End 

更新:我发现了一些非常有趣的东西,如何使用“本地”变量实际减少 forloop.counter:

{% cycle 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 as dec %}

{% for i in item %}
    {% cycle 'Start' '' '' '' %}
    {% if i %}
        item{{ forloop.counter|add:dec }}
    {% else %}
        <!-- empty {% cycle dec %} here we move to the next decrementing value -->
    {% endif %}
    {% cycle '' '' '' 'End' %}
{% endfor %} 
于 2012-07-04T10:02:40.900 回答
0

改编自 Tisho 的回答:

{% for i in item %}
    {% if i %}
        {% cycle 'Start' '' '' '' %}
            item{% cycle 1 2 3 4 5 6 7 8 %}
        {% cycle '' '' '' 'End' %}
    {% endif %}
{% endfor %}

那将输出:

Start
item1 
item2
item3 
item4 
End 
Start
item5
item6 
item7 
item8 
End

so no holes any longer ! But this only works if you have a limited number of values, as you're obliged to write them all in the 2nd cycle tag used...

于 2012-07-04T10:19:22.497 回答
-2

如果 django 模板不能实现,尝试自己写一个,检查这里django 自定义模板标签

于 2012-07-04T09:52:43.800 回答