1. 程式人生 > >django 模板裡面for迴圈和forloop變數

django 模板裡面for迴圈和forloop變數

Django模板的{% for %}迴圈

Django模板的{% for %}迴圈與Python的for 語句的情形類似:

迴圈語法:

 for X in Y ,( Y是要迭代的序列,X是在每一個特定的迴圈中使用的變數名稱)。每一次迴圈中,模板系統會渲染在{% for %} and {% endfor %} 中的所有內容。

例: 

給定一個運動員列表athlete_list 變數,我們可以使用下面的程式碼來顯示這個列表: <ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>


注1: 給標籤增加一個reversed 使得該列表被反向迭代:
{% for athlete in athlete_list reversed %}
...
{% endfor %}
注2:可以巢狀使用{% for %} 標籤:
{% for country in countries %}
<h1>{{ country.name }}</h1>
<ul>
{% for city in country.city_set.all %} 
<li>{{ city }}</li>
{% endfor %}
</ul>
{% endfor %}
注3:Django不支援退出迴圈操作。如果我們想退出迴圈,可以改變正在迭代的變數,讓其僅僅包含需要迭代的專案。同理,Django也不支援continue語句,我們無法讓當前迭代操作跳回到迴圈頭部。(請參看本章稍後的理念和限制小節,瞭解下決定這個設計的背後原因)

Diango模板中的forloop變數

{% for %} 標籤在迴圈中設定了一個特殊的 forloop 模板變數。這個變數能提供一些當前迴圈進展的資訊:

1. forloop.counter  : forloop.counter總是一個表示當前迴圈的執行次數的整數計數器。這個計數器是從1開始的,所以在第一次迴圈時forloop.counter 將會被設定為1。例子如下:

{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>

{% endfor %}

2.  forloop.counter0 : forloop.counter0 類似於 forloop.counter ,但是它是從0計數的。第一次執行迴圈時這個變數會被設定為0。

3.  forloop.revcounter : forloop.revcounter 是表示迴圈中剩餘項的整型變數。在迴圈初次執行時 forloop.revcounter 將被設定為序列中項的總數。最後一次迴圈執行中,這個變數將被置1。 

4. forloop.revcounter0 : forloop.revcounter 0類似於 forloop.revcounter ,但它以0做為結束索引。在第一次執行迴圈時,該變數會被置為序列的項的個數減1。在最後一迭代時,該變數為0。

5. forloop.first 是一個布林值。在第一次執行迴圈時該變數為True,在下面的情形中這個變數是很有用的。

{% for object in objects %}
{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
{{ object }}
</li>

{% endfor %}

6. forloop.last 是一個布林值;在最後一次執行迴圈時被置為True。一個常見的用法是在一系列的連結之間放置管道符(|)

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
顯示如下:

Link1 | Link2 | Link3 | Link4

7. 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 %}

注1.  forloop 變數僅僅能夠在迴圈中使用,在模板解析器碰到 {% endfor %} 標籤時, forloop 就不可訪問了。

注2.  Context和forloop變數

 在一個{% for %} 塊中,已存在的變數會被移除,以避免 forloop 變數被覆蓋。Django會把這個變數移動到
forloop.parentloop 中。通常我們不用擔心這個問題,但是一旦我們在模板中定義了 forloop 這個變數(當然我們反對這樣做),在{% for %} 塊中它會在forloop.parentloop 被重新命名。

參考連結:

http://wanglianghuaihua.blog.163.com/blog/static/54251531201332894755248/