我在模板中有代码:
{% 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
语句的第一次迭代的时间。有什么办法吗?
答案 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"