第九章、模板詳解 -- DTL

  • 作爲Web框架,Django提供了模板,用於編寫html代碼,還可以嵌入模板代碼更快更方便的完成頁面開發,再通過在視圖中渲染模板,將生成最終的html字符串返回給客戶端瀏覽器

  • 模板致力於表達外觀,而不是程序邏輯

  • 模板的設計實現了業務邏輯view與顯示內容template的分離,一個視圖可以使用任意一個模板,一個模板可以供多個視圖使用

  • 模板包含兩部分:
    靜態部分,包含html、css、js
    動態部分,就是模板語言

  • Django處理模板分爲兩個階段:
    加載:根據給定的路徑找到模板文件,編譯後放在內存中。
    渲染:使用上下文數據對模板插值並返回生成的字符串。

  • 爲減少重複編寫加載、渲染的代碼,Django提供了簡寫函數render(),用於調用模板。

Django模板語言(DTL)

  • 定義在django.template包中
  • 模板語言包括4種類型,分別是:模板變量、模板標籤、模板過濾器、模板註釋

模板變量
模板變量的用來顯示從服務端傳遞過來的數據

  • 語法格式:
    HTML頁面:{{ 變量名 }}
    視圖處理函數:return render(request, 'HTML頁面', 字典數據)

  • 變量名,使用字典數據中的鍵作爲變量名

  • 獲取不同類型的數據
    數字類型:{{ 變量名 }}
    字符串類型:{{ 變量名 }}
    列表類型:{{ 變量名.下標 }}
    字典類型:{{ 變量名.鍵 }}
    對象類型:{{ 變量名.屬性 }}

  • 如果變量不存在時,顯爲空字符串

  • 在模板中可以調用方法,但不能傳遞參數

實例演練: 將字典值傳遞給頁面

  • 修改urls.py文件:url(r'^temp_var/$', views.temp_var),
  • 修改views.py文件:

 

def temp_var(request):
    dict = {'title': '字典鍵值'}
    book = BookInfo()
    book.btitle = '對象屬性'
    context = {'dict': dict, 'book': book}
    return render(request, 'app/temp_var.html', context)
  • templates/app目錄中添加頁面文件temp_var.html

 

<body>
模板變量:<br/>
{{ dict.title }}<br/>
{{ book.btitle }}<br/>
</body>
  • 在瀏覽器中查看結果

課堂練習

  1. 創建一個查詢頁面searchbook.html,用來輸入圖書的名字
  2. 將對應的圖書信息顯示在bookinfo.html頁面上
  3. 假設查詢到的圖書只有一本
  • searchbook.html

 

<body>
<form action="/app/dosearchbook/", method="post">
    請輸入書名:<input type="text" name="bookname">
    <br>
    <input type="submit">
</form>
</body>
  • bookinfo.html

 

<body>
書名:{{ book.btitle }} <br>
出版日期:{{ book.bpub_date }} <br>
閱讀數:{{ book.bread }} <br>
</body>
  • searchbook

 

def searchbook(request):
    return render(request, 'app/searchbook.html')
  • dosearchbook

 

def dosearchbook(request):
    bookname = request.POST.get('bookname')  # 用戶輸入的書名
    book = BookInfo.bookm.get(btitle=bookname)  # 根據用戶輸入的書名查詢DB,得到圖書對象

    content = {
        'book': book,
    }

    return render(request, 'app/bookinfo.html', content)
  • urls

 

    url(r'^searchbook/$', views.searchbook),
    url(r'^dosearchbook/$', views.dosearchbook)

模板標籤
語法格式:{% 代碼段 %}

  • for標籤語法格式:

 

{% for item in 列表 %}
    循環邏輯
    {{ forloop.counter }}表示當前是第幾次循環,從1開始
{% empty %}
    列表爲空或不存在時執行此邏輯
{% endfor %}
  • if標籤語法格式:

 

{% if 條件1 %}
    邏輯1
{% elif 條件2 %}
    邏輯2
{% else %}
    邏輯3
{% endif %}
  • 比較運算符:==!=<><=>=
    注意: 運算符左右兩側不能緊挨變量或常量,必須有空格。

  • 邏輯運算符:andornot

實例演練: 在頁面上顯示圖書列表

  • 修改urls.py文件:url(r'^temp_book/$', views.temp_book),
  • 修改views.py文件:

 

def temp_book(request):
    context = {'list': BookInfo.objects.all()}
    return render(request, 'app/temp_book.html', context)
  • templates/app目錄中添加頁面文件temp_book.html

 

<body>
圖書列表如下:
<ul>
    {% for book in list %}
        {% if book.id <= 2 %}
            <li style="color: red;">{{ book.btitle }}</li>
        {% elif book.id <= 3 %}
            <li style="color: blue;">{{ book.btitle }}</li>
        {% else %}
            <li style="color: green;">{{ book.btitle }}</li>
        {% endif %}
    {% empty %}
        <li>對不起,沒有圖書</li>
    {% endfor %}
</ul>
</body>
  • 在瀏覽器中查看結果

模板過濾器
使用過濾器對變量進行計算、格式轉換等操作

  • 語法格式:變量|過濾器:參數

  • 常用過濾器:
    length,返回字符串包含字符的個數,或列表、元組、字典的元素個數。
    default,如果變量不存在時則返回默認值。
    date,用於對日期類型的值進行字符串格式化,常用的格式化字符如下:
    Y表示年,格式爲4位,y表示兩位的年。
    m表示月,格式爲01,02,12等。
    d表示日, 格式爲01,02等。
    j表示日,格式爲1,2等。
    H表示時,24進制,h表示12進制的時。
    i表示分,爲0-59。
    s表示秒,爲0-59。

實例演練: 對書名大於4個字符的圖書,格式化其出版時間

  • 修改urls.py文件:url(r'^temp_filter/$', views.temp_filter),
  • 修改views.py文件:

 

def temp_filter(request):
    context = {'list': BookInfo.objects.all()}
    return render(request, 'app/temp_filter.html', context)
  • templates/app目錄中添加頁面文件temp_filter.html

 

<body>
圖書列表如下:
<ul>
    {% for book in list %}
        {% if book.btitle|length > 4 %}
            <li style="color: red;">
                {{ book.btitle }}
                ---默認時間格式爲:
                {{ book.bpub_date }}
            </li>
        {% else %}
            <li style="color: green;">
                {{ book.btitle }}
                ---格式化時間爲:
                {{ book.bpub_date|date:"Y-m-j" }}
            </li>
        {% endif %}
    {% endfor %}
</ul>
</body>
  • 在瀏覽器中查看結果

模板註釋

  • 在模板中使用如下模板註釋,這段代碼不會被編譯,不會輸出到客戶端
  • html註釋只能註釋html內容,不能註釋模板語言。
  • 單行註釋語法格式:
    {#...#},註釋可以包含任何模版代碼,有效的或者無效的都可以。
  • 多行註釋使用comment標籤,語法格式:
    {%comment%}
    ...
    {%endcomment%}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章