【问题标题】:Django template for loop. Member before用于循环的 Django 模板。之前的会员
【发布时间】:2011-11-26 00:23:06
【问题描述】:

我想创建这样的循环:

{% 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]

附: .before 是理论上的,objects 是简单的查询列表。我想对在当前循环成员之前遇到的循环成员进行处理。

【问题讨论】:

    标签: django templates for-loop


    【解决方案1】:

    内置的模板标签和过滤器并不容易(从 Django 1.4 开始),但可以通过使用 with 标签缓存变量和 addslugify 和 @ 987654324@ 过滤以生成只有一个成员的新列表。

    以下示例创建一个新列表,其唯一成员是 forloop 的前一个成员:

    {% 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 %}
    

    这不是一个优雅的解决方案,但 django 模板系统有两个错误,这使得那些不会编写自定义标签的人无法避免这种黑客攻击:

    1. Django 模板语法不允许嵌套花括号。否则,我们可以这样做:

          {{ list.{{ forloop.counter|add:-1  }} }}
      
    2. 查找运算符不接受使用 with 存储的值(也许有充分的理由)

          {% with forloop.counter|add:-1 as index %}
              {{ list.index }}
          {% endwith %}
      

    【讨论】:

      【解决方案2】:

      检查ifchanged模板标签

      【讨论】:

      • 这直接解决了我的问题+1,但它没有回答我提出的问题——“我想对在当前循环成员之前遇到的循环成员进行处理”
      • 使用自定义模板标签来记住最后一个对象,例如soyoucode.com/2011/set-variable-django-template
      【解决方案3】:

      有一个“简单的方法”可以做到这一点:编写一个自定义模板标签。他们真的不难。这可能会奏效(未经测试):

      @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
      

      【讨论】:

      • 如果可能,我正在寻找模板解决方案。如果我找不到任何其他方法来解决这个问题,这是显而易见的方法。
      【解决方案4】:

      只要object 有一个名为before 的属性或无参数方法,并且objects 是可迭代的(并且定义了'

      {% for object in objects %}
          {% if object.before < object %}
              this is bigger
          {% else %}
              this is smaller
      {% endfor %}
      

      【讨论】:

      • 显然我被误解了。更新了问题。
      猜你喜欢
      • 2013-08-31
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多