循环的Django模板。会员之前

时间:2011-09-27 12:30:47

标签: django templates for-loop

我想创建这样的循环:

{% 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是理论上的,对象是简单的查询列表。我想对当前循环成员之前遇到的循环成员采取行动。

4 个答案:

答案 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模板系统有两个错误,对于那些不编写自定义标签的人来说,这种黑客攻击是不可避免的:

  1. 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 %}
    
  2. 查找运算符不接受使用 {{ 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 %}