我想创建这样的循环:
{% for object in objects %}
{% if object.before != object %}
{{ object }} this is different
{% else %}
{{ object }} this is the same
{% endfor %}
基于https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#for我做不到。真的没有简单的方法吗?或者我只需要使用计数器并检查objects[counter-1]
?
P.S。 .before
是理论上的,对象是简单的查询列表。我想对当前循环成员之前遇到的循环成员采取行动。
答案 0 :(得分:5)
检查ifchanged模板标记
答案 1 :(得分:0)
执行此操作有一种“简单方法”:编写自定义模板标记。他们真的不难。这可能会成功(未经测试):
@register.simple_tag
def compare_objects(object_list):
comparisons = []
for i in range(1, len(object_list)):
if object_list[i] > object_list[i-1]:
comparisons.append('bigger')
else:
comparisons.append('smaller')
return comparisons
答案 2 :(得分:0)
内置的模板标签和过滤器不容易(从Django 1.4开始),但可以使用with
标记来缓存变量和add
,{{ 1}}和slugify
过滤器生成只包含一个成员的新列表。
以下示例创建一个新列表,其唯一成员是slice
的前一个成员:
forloop
这不是一个优雅的解决方案,但是django模板系统有两个错误,对于那些不编写自定义标签的人来说,这种黑客攻击是不可避免的:
Django模板语法不允许嵌套的卷曲括号。否则,我们可以这样做:
{% for item in list %}
{% if not forloop.first %}
{% with forloop.counter0|add:"-1" as previous %}
{% with previous|slugify|add:":"|add:previous as subset %}
{% with list|slice:subset as sublist %}
<p>Current item: {{ item }}</p>
<p>Previous item: {{ sublist.0 }}</p>
{% endwith %}
{% endwith %}
{% endwith %}
{% endif %}
{% endfor %}
查找运算符不接受使用 {{ list.{{ forloop.counter|add:-1 }} }}
存储的值(也许是有充分理由的)
with
答案 3 :(得分:-2)
只要object
具有名为before
的属性或无参数方法,并且objects
是可迭代的(并且&lt; 1),此代码应该可以正常用作django模板。 '已定义)。
{% for object in objects %}
{% if object.before < object %}
this is bigger
{% else %}
this is smaller
{% endfor %}