DTL語言學習(二){% for %}標籤的使用
首先新建一個測試專案,然後新建一個for_demo
的app,在app中新建一個urls.py檔案,在新建一個templates的資料夾。裡面新建一個for.html
的檔案,然後將app新增至settings.py檔案中,然後配置好一切路徑,在for_demo中的views.py中渲染模板for.html,這些都配置成功後,我們就可以進行{% for %}標籤的學習了。
在views.py中編寫程式碼:
from django.shortcuts import render
# Create your views here.
def index(request):
books = ['三國演義','西遊記','紅樓夢','水滸傳']
return render(request,'for.html',{'books':books})
在for.htmlbody
中寫入程式碼:
<ul>
{% for book in books %}
<li>{{ book }}</li>
{% endfor %}
</ul>
然後就可以輸入網址進行測試了
效果如下
如果在for後面新增一個reversed
,就會反向遍歷列表。
<ul>
{% for book in books reversed %}
< li>{{ book }}</li>
{% endfor %}
</ul>
這樣我們就能使用for
遍歷一個列表了,接下來我們傳入一個字典來進行遍歷。
修改views中的程式碼
from django.shortcuts import render
# Create your views here.
def index(request):
books = ['三國演義','西遊記','紅樓夢','水滸傳']
persion = {'name':'張三','age':18,'sex':'男'}
return render(request, 'for.html',{'books':books,'persion':persion,})
再修改for.html
中body
中的程式碼:
<ul>
{% for book in books reversed %}
<li>{{ book }}</li>
{% endfor %}
</ul>
<ul>
{% for key in persion.keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<ul>
{% for value in persion.values %}
<li>{{ value }}</li>
{% endfor %}
</ul>
<ul>
{% for key,value in persion.items %}
{{ key }}<b>:</b>{{ value }}<br>
{% endfor %}
</ul>
然後我們檢視效果圖:
這樣,我們就實現了對一個字典的遍歷。
接下來我們實現一下稍微複雜一點的遍歷,列表中巢狀字典
在views中寫入:
from django.shortcuts import render
# Create your views here.
def index(request):
books = ['三國演義', '西遊記', '紅樓夢', '水滸傳']
persion = {'name': '張三', 'age': 18, 'sex': '男'}
detail_books = [
{'name':'三國演義','author':'羅貫中','price':99},
{'name':'西遊記','author':'吳承恩','price':199},
{'name':'紅樓夢','author':'曹雪芹','price':299},
{'name':'水滸傳','author':'施耐庵','price':399},
]
return render(request,'for.html',{'books':books,'persion':persion,'detail_books':detail_books})
for.html
中的body寫入:
<ul>
{% for book in books reversed %}
<li>{{ book }}</li>
{% endfor %}
</ul>
<ul>
{% for key in persion.keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<ul>
{% for value in persion.values %}
<li>{{ value }}</li>
{% endfor %}
</ul>
<ul>
{% for key,value in persion.items %}
{{ key }}<b>:</b>{{ value }}<br>
{% endfor %}
</ul>
<table>
<thead>
<tr>
<td>序號</td>
<td>書名</td>
<td>作者</td>
<td>價格</td>
</tr>
</thead>
<tbody>
{% for detail_book in detail_books %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ detail_book.name }}</td>
<td>{{ detail_book.author }}</td>
<td>{{ detail_book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
然後輸入網址檢視效果
注: DTL中for中提供的一些變數:
forloop.counter
:當前迴圈的下標。以1作為起始值。forloop.counter0
:當前迴圈的下標。以0作為起始值。forloop.revcounter
:當前迴圈的反向下標值。比如列表有5個元素,那麼第一次遍歷這個屬性是等於5,第二次是4,以此類推。並且是以1作為最後一個元素的下標。forloop.revcounter0
:類似於forloop.revcounter。不同的是最後一個元素的下標是從0開始。forloop.first
:是否是第一次遍歷。forloop.last
:是否是最後一次遍歷。forloop.parentloop
:如果有多個迴圈巢狀,那麼這個屬性代表的是上一級的for迴圈。
在剛才的例子中我們就用到了forloop.counter
這個變數。
接下來我們來測試一下forloop.first
和forloop.last
這兩個變數
for.html
中<table>
中修改程式碼為:
<table>
<thead>
<tr>
<td>序號</td>
<td>書名</td>
<td>作者</td>
<td>價格</td>
</tr>
</thead>
<tbody>
{% for detail_book in detail_books %}
{% if forloop.first %}
<tr style="background: brown">
{% elif forloop.last %}
<tr style="background: greenyellow">
{% else %}
<tr>
{% endif %}
<td>{{ forloop.counter }}</td>
<td>{{ detail_book.name }}</td>
<td>{{ detail_book.author }}</td>
<td>{{ detail_book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
我們對遍歷進行了判斷,如果為第一次遍歷,就將背景顏色改為brown
,如果是最後一次遍歷,就將背景顏色改為greenyellow
,其它的都不進行改變。
效果圖為
for標籤中還有一個empty
標籤
這個標籤使用跟for...in...
是一樣的,只不過是在遍歷的物件如果沒有元素的情況下,會執行empty
中的內容。
我們在views中新增一個空的列表movies
,然後將其傳遞至for.html
中,然後在body中新增一個for迴圈:
{% for movie in movies %}
<p>{{ movie }}</p>
{% empty %}
<h1>還沒有任何電影</h1>
{% endfor %}
效果圖為
而如果我們在views
中的movies
中新增一個數據,就不會執行{% empty %}
中的內容了。
總結
- 模板中的for…in…沒有continue和break語句,這一點和Python中有很大的不同,一定要記清楚!
- 獲得字典的某個值可以使用
<字典名稱>.<key>
來獲取。不能像python那樣來獲取。<字典名稱>[key]
這樣是不對的,DTL語言不能識別,只有python才能識別。 - 想獲取列表中的某個值可以用
<列表名>.<下標>
來獲取。也不能像python那樣來獲取。<列表名>[下標]
這樣也是不對的,DTL語言也不能識別,只有python才能識別。