django模板中的自定义计数器

时间:2015-12-03 06:29:18

标签: python django django-templates

我在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.

3 个答案:

答案 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