1. 程式人生 > >DTL語言學習(二){% for %}標籤的使用

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.htmlbody中的程式碼:

<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.firstforloop.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 %}中的內容了。

總結

  1. 模板中的for…in…沒有continue和break語句,這一點和Python中有很大的不同,一定要記清楚!
  2. 獲得字典的某個值可以使用<字典名稱>.<key>來獲取。不能像python那樣來獲取。<字典名稱>[key]這樣是不對的,DTL語言不能識別,只有python才能識別。
  3. 想獲取列表中的某個值可以用<列表名>.<下標>來獲取。也不能像python那樣來獲取。<列表名>[下標]這樣也是不對的,DTL語言也不能識別,只有python才能識別。