forloop.counter表示for标记经过循环的次数

时间:2014-08-15 16:33:56

标签: python django loops counter

目前正在浏览Django教程(民意调查)。

我知道for标签允许你循环遍历列表或字典,以便做你定义的任何事情。

但是计算标签循环次数的目的是什么?

此外,一个循环的例子是不止一次超过同一个列表/字典?

这里有点困惑......

<h1>{{ poll.question }}</h1> 
{% if error_message %}
  <p><strong>{{ error_message }}</strong></p>
{% endif %}
<form action="{% url 'polls:vote' poll.id %}" method="post">{% csrf_token %}
 {% for choice in poll.choice_set.all %}
   <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
   <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label>
   <br />
 {% endfor %}
<input type="submit" value="Vote" />
</form> 

在这种情况下foorloop.counter的目的是什么?

2 个答案:

答案 0 :(得分:6)

模板变量forloop.counter返回当前for循环的当前迭代,从1开始索引。有很多情况下可以使用这个变量。一个例子是:

<table>
    <thead>
        <tr>
            <th>#</th>
            <th>Object</th>
        </tr>
    </thead>
    <tbody>
        {% for object in objects %}
            <tr>
                <td>{{ forloop.counter }}</td> {# Print the number of the list, starting at 1 #}
                <td>{{ object }}</td> {# Print object unicode #}
            </tr>
        {% endfor %}
    </tbody>
</table>

会打印一个类似于此的表格(当然还有适当的渲染):

# | Object
------------
1 | Object 3
2 | Object 7
3 | Object 2

请注意,除非以某种方式对对象的QuerySet进行排序,否则它们的顺序可能是任意的。对象的id与for循环的迭代无关。

还有forloop.counter0将返回当前迭代,从0开始索引。


虽然你的第二个问题有些不相关,但是人们可能希望多次迭代一个列表以在不同的部分中呈现该列表中的信息。因此,您可能有一个列表显示有关对象的信息,然后在页面的下方显示一个不同的列表,显示有关该对象的不同信息。

但是,我会说最好尽你所能避免多次遍历列表,因为这通常是不必要的。

当然,除非你需要,否则不要担心使用它,但我想知道这件事很好。


在更新的示例中,forloop.counter变量用于区分表单中的选项。因此idfor都等于choice#,其中#是循环的当前迭代。

id代码的<input>字段允许<label>代码标识(通过for字段)应显示的<input>代码。否则,标签不知道要显示哪个单选按钮。

文档说明了表单的用途:

  

上面的模板显示每个问题选择的单选按钮。每个单选按钮的值是相关的问题选择ID。每个单选按钮的名称是“选择”。这意味着,当某人选择其中一个单选按钮并提交表单时,它将发送POST数据选项=#其中#是所选选项的ID。这是HTML表单的基本概念。

请注意,forloop.counter值仅用于正确显示HTML表单,并且其值实际上并未以任何重要方式使用。 forloop.counter的值与实际选择无关,因此您可以看到表单POST选项的id,而不是forloop.counter值。


为了让您更加清楚,这里是需要forloop.counter变量的示例。

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Object</th>
        </tr>
    </thead>
    <tbody>
        {% for object in objects %}
            <tr>
                <td>{{ object.pk }}</td> {# Print the pk of the object #}
                <td>{{ object }}</td> {# Print object unicode #}
            </tr>
        {% endfor %}
    </tbody>
</table>

可以打印类似于此的表格(当然还有适当的渲染):

ID | Object
------------
3 | Object 3
7 | Object 7
2 | Object 2

在您的视图中,您可以根据ID / pk订购此对象列表,如下所示:

queryset = Object.objects.all().order_by('-pk') # Order all objects by pk in descending order

然后,相同的模板将按如下方式呈现您的表:

ID | Object
------------
2 | Object 2
3 | Object 3
7 | Object 7

通常,for循环的每次迭代都会做同样的事情,而你并不关心它是哪个迭代。您从本教程发布的示例很好地使用了forloop.counter,但它也不是唯一的方法。您也可以使用选项的pk字段,因为我们知道这对每个选项都是唯一的。

答案 1 :(得分:1)

如果您想要检测所需的特定步骤,

forloop.counterforloop.counter0会对您有所帮助。喜欢:

{% for i in some_list %}
  {% if forloop.counter == 3 %}
    3rd element is special for me: {{i}}
  {% else %}
    {{i}}
  {% endif %}
{% endfor %}

for循环在列表上不止一次循环--- mm ..我应该说什么...目标实际上是通过从后端等等渲染第二个循环所需的对象来避免这样的事情。如果你想要更准确的答案,你需要更具体。

{% for choice in poll.choice_set.all %}
  <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
  <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label>
  <br />
{% endfor %}

此forloop的目的很简单:显示民意调查的所有选择。