{% for %} 容許咱們在一個序列上迭代。與Python的for 語句的情形相似,循環語法是 for X in Y ,Y是要迭代的序列
而X是在每個特定的循環中使用的變量名稱。每一次循環中,模板系統會渲染在{% for %} and {% endfor %} 中的全部內
容。
例如,給定一個運動員列表athlete_list 變量,咱們可使用下面的代碼來顯示這個列表:
python
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
給標籤增長一個reversed 使得該列表被反向迭代:
oop
{% for athlete in athlete_list reversed %} ... {% endfor %}
能夠嵌套使用{% for %} 標籤:
this
{% for country in countries %} <h1>{{ country.name }}</h1> <ul> {% for city in country.city_list %} <li>{{ city }}</li> {% endfor %} </ul> {% endfor %}
Django不支持退出循環操做。若是咱們想退出循環,能夠改變正在迭代的變量,讓其僅僅包含須要迭代的項目。同
理,Django也不支持continue語句,咱們沒法讓當前迭代操做跳回到循環頭部。
{% for %} 標籤在循環中設置了一個特殊的 forloop 模板變量。這個變量能提供一些當前循環進展的信息:
forloop.counter 老是一個表示當前循環的執行次數的整數計數器。這個計數器是從1開始的,
因此在第一次循環時forloop.counter 將會被設置爲1。例子以下:
spa
{% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %}
forloop.counter0 相似於 forloop.counter ,可是它是從0計數的。第一次執行循環時這個變量會被設置爲0。
forloop.revcounter 是表示循環中剩餘項的整型變量。在循環初次執行時 forloop.revcounter 將被設置爲序列中項的總
數。最後一次循環執行中,這個變量將被置1。
forloop.revcounter0 相似於 forloop.revcounter ,但它以0作爲結束索引。在第一次執行循環時,該變量會被置爲序
列的項的個數減1。在最後一次迭代時,該變量爲0。
forloop.first 是一個布爾值。在第一次執行循環時該變量爲True,在下面的情形中這個變量是頗有用的。
code
{% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %}
forloop.last 是一個布爾值;在最後一次執行循環時被置爲True。一個常見的用法是在一系列的連接之間放置管道符(|)
orm
{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
The above template code might output something like this::
Link1 | Link2 | Link3 | Link4
forloop.parentloop 是一個指向當前循環的上一級循環的 forloop 對象的引用(在嵌套循環的狀況下)。例子在此:
對象
{% for country in countries %} <table> {% for city in country.city_list %} <tr> <td>Country #{{ forloop.parentloop.counter }}</td> <td>City #{{ forloop.counter }}</td> <td>{{ city }}</td> </tr> {% endfor %} </table> {% endfor %}
forloop 變量僅僅可以在循環中使用,在模板解析器碰到 {% endfor %} 標籤時, forloop 就不可訪問了。
Context和forloop變量
在一個{% for %} 塊中,已存在的變量會被移除,以免 forloop 變量被覆蓋。Django會把這個變量移動到
forloop.parentloop 中。一般咱們不用擔憂這個問題,可是一旦咱們在模板中定義了 forloop 這個變量(固然咱們反對這
樣作),在{% for %} 塊中它會在 forloop.parentloop 被從新命名。
索引