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

z82*_*82n 1 python django counter loops

目前正在进行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> 
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*dt6 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>
Run Code Online (Sandbox Code Playgroud)

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

# | Object
------------
1 | Object 3
2 | Object 7
3 | Object 2
Run Code Online (Sandbox Code Playgroud)

请注意,除非以某种方式对对象的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>
Run Code Online (Sandbox Code Playgroud)

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

ID | Object
------------
3 | Object 3
7 | Object 7
2 | Object 2
Run Code Online (Sandbox Code Playgroud)

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

queryset = Object.objects.all().order_by('-pk') # Order all objects by pk in descending order
Run Code Online (Sandbox Code Playgroud)

然后,相同的模板将呈现您的表,如下所示:

ID | Object
------------
2 | Object 2
3 | Object 3
7 | Object 7
Run Code Online (Sandbox Code Playgroud)

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