我在django模板页面中有这段代码
<select class="selectpicker datatable-column-control" multiple
{% for q_group in question_groups %}
<optgroup label="{{ q_group.name }}">
{% for q in q_group.questions %}
<option value="{{ forloop.counter0 }}">{{ q.title }}</option>
{% endfor %}
</optgroup>
{% endfor %}
我希望每个迭代中增加的每个选项标记都有一个值。如果我有10个选项标签,那么它们的值将从0到9。
forloop.counter0
无法满足我的需要,因为当外循环完成一次时内循环计数器初始化为0.
答案 0 :(得分:2)
如何将itertools.count
对象传递给模板?
模板:
<select class="selectpicker datatable-column-control" multiple>
{% for q_group in question_groups %}
<optgroup label="{{ q_group.name }}">
{% for q in q_group.questions %}
<option value="{{ counter }}">{{ q.title }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
查看:
import itertools
import functools
render(request, 'template.html', {
question_groups: ...,
counter: functools.partial(next, itertools.count()),
})
答案 1 :(得分:0)
恢复此帖子,仅使用模板语言提供解决方案。
如果您知道计数器之间只有一个{% for %}
(如上例所示),请使用forloop.parentloop。您可以将其中的许多链接在一起,但必须知道分隔所需循环的循环数,并且在少数(forloop.parentloop.parentloop...
)之后使用它变得不太理想。
{% for foo in foos %}
{% for bar in bars %} {# exactly one for loop between here #}
{{ forloop.parentloop.counter0 }} is the index of foo.
{% endfor %}
{% endfor %}
如果两者之间有任意数量的for循环(例如在模板中你无法控制,或者django-crispy-forms),请使用with statement保存循环变量:
{% for foo in foos %}
{% with foo_num=forloop.counter0 %}
{% for bar in bars %} {# any number of for loops between #}
{{ foo_num }} is the index of foo.
{% endfor %}
{% endwith %}
{% endfor %}
Falsetru的解决方案最适合缺少for循环的计数器,或者在一个结束后继续计数的计数器。只有内置函数才能实现此功能,因此必须使用来自falsetru的答案的迭代工具。
{% for foo in foos %}
{{ counter }} is the index of foo
{% endfor %}
{% for bar in bars %}
{{ counter }} is the index of bar + len(foos)
{% endfor %}
答案 2 :(得分:0)
您可以这样做:
{% for foo in foos %}
{{ forloop.counter0 }}
{% endfor %}
请参见https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#for