如何识别if语句中的第一个循环调用?

时间:2015-11-25 21:12:16

标签: django django-templates

我在模板中有代码:

{% for p in products %}
    {% if p.parent == None %}
        <li class="{% if forloop.first %}active{% endif %}">
            {{ p.name|upper }}
        </li>
    {% endif %}
{% endfor %}

在我的案例课程中#34;活跃&#34;用父母向我显示!=无。我无法在视图中使用[...]过滤器(parent = None),因为我必须有完整的产品列表。

问题是,如果产品=! None中的第一个object.parent,Django会认为第一次迭代发生了,所以我永远不会将active添加到我的班级。 所以我想检查发生成功if语句的第一次迭代的时间。有什么办法吗?

4 个答案:

答案 0 :(得分:3)

您可以在python中恢复视图中的第一个元素,将其添加到上下文中,然后在模板中进行测试:

{% for p in products %}
    {% if not p.parent %}
        <li class="{% if p == first_element %}active{% endif %}">
            {{ p.name|upper }}
        </li>
    {% endif %}
{% endfor %}

答案 1 :(得分:0)

{% with is_first=True %}
{% for p in products %}
    {% if p.parent == None %}
        <li class="{% if is_first %}active{% endwith % }{% endif %}">
            {{ p.name|upper }}
        </li>
    {% endif %}
{% endfor %}

现在无法测试 - 但也许这项工作!

答案 2 :(得分:0)

在构建上下文时,可以将它放在对象本身上或作为额外变量。做这样的代码:

e.g。而不是:

ctx['products'] = Product.objects.all()

做这样的事情:

ctx['products'] = list(Product.objects.all())
   is_first = True
   for p in ctx['products']:
      p.is_active = p.parent is None and is_first:
      is_first = False

然后在模板中,执行:

<li class="{% if p.is_active %}active{% endif %}">
    {{ p.name|upper }}
</li>

如果您不想在对象上书写,请使用额外的变量

ctx['products'] = list(Product.objects.all())
   is_first = True
   for p in ctx['products']:
      if p.parent is None and is_first: 
          ctx['active_id'] = p.id
          break

然后在模板中,执行:

<li class="{% if p.id == active_id %}active{% endif %}">
    {{ p.name|upper }}
</li>

答案 3 :(得分:0)

您也可以像这样使用forloop.counter

ng-show="$index==0 || items[$index-1].IDTYPE!=items[$index].IDTYPE"