当迭代我的一个Django模板中的列表时,我试图输入一些if逻辑来说'如果最后的项'类型'值等于loop'type'值中的当前项,但似乎在Django模板中不允许使用python语法。我知道我可以使用{{forloop.counter}},但我似乎无法使用该计数器从我的列表中获取特定索引处的项目。
HTML
{% for repair in repairs %}
{% if repairs[{{ forloop.counter - 1}}].type == repair.type %}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endif %}
<div class="col-sm-6">
<label>
<input type="checkbox" name="{{ repair }}">
{{ repair }}</label>
</div>
{% endfor %}
或
{% for index, repair in enumerate(repairs) %}
{% if repairs[index - 1].type == repair.type%}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endif %}
<div class="col-sm-6">
<label>
<input type="checkbox" name="{{ repair }}">
{{ repair }}</label>
</div>
{% endfor %}
答案 0 :(得分:1)
您的代码存在多个问题。
如Justin所述,Django模板不允许您使用list[index]
之类的内容访问列表元素。相反,你应该做list.index
Django模板引擎无法确定变量的类型。但是,您可以实现模板过滤器并使用它来确定变量的类型,如this答案中所述。
此外,您应该{{ forloop.counter - 1}}
而不是{{ forloop.counter0 - 1}}
。 forloop.counter
给出循环的1索引迭代,而forloop.counter0
给出循环的0索引迭代。
所以你的最终代码应该是这样的:
from django import template
register = template.Library()
@register.filter
def get_type(value):
return type(value)
{% for repair in repairs %}
{% if repairs.{{ forloop.counter0 - 1}}|get_type == repair|get_type %}
<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;">
<h2>{{ repair|get_type }}</h2>
</div>
{% endif %}
<div class="col-sm-6">
<label>
<input type="checkbox" name="{{ repair }}">
{{ repair }}
</label>
</div>
{% endfor %}
修改:在您澄清后,该类型&#39;实际上是变量的一个属性,这是你的代码应该是:
{% for repair in repairs %}
{% if repairs.{{ forloop.counter0 - 1}}.type == repair.type %}
<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;">
<h2>{{ repair.type }}</h2>
</div>
{% endif %}
<div class="col-sm-6">
<label>
<input type="checkbox" name="{{ repair }}">
{{ repair }}
</label>
</div>
{% endfor %}
当然,Daniel建议的方法是更好的方法。
答案 1 :(得分:1)
您应该可以使用ifchanged
。
{% for repair in repairs %}
{% ifchanged repair.type %}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endifchanged %}
...
{% endfor %}
答案 2 :(得分:0)
您的用例regroup
{% regroup repairs by type as types %}
{% for type in types %}
<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ type.grouper}}</h2></div>
{% for repair in type.list %}
<div class="col-sm-6">
<label>
<input type="checkbox" name="{{ repair }}">{{ repair }}
</label>
</div>
{% endfor %}
{% endfor %}