天天看點

Python Django Web 架構程式設計 - 模闆 templates

作者:逸劍聽潮

之前的例子中,HttpResponse都是把結果直接顯示在頁面上,也就是頁面的設計寫死在視圖函數的代碼裡的。如果想改變頁面的樣子,就行需要修改 Python 代碼,這樣很不友善。 Django 提供了模闆系統,隻要建立一個視圖,就可以将頁面的設計從代碼中分離出來。

Django 做為一個 Web 架構,采用了模闆來動态生成 HTML。模闆包含所需 HTML 輸出的靜态部分以及一些描述如何插入動态内容的特殊文法。

一個 Django 項目可以配置一個或多個模闆引擎。Django 為自己的模闆系統(創造性地稱為 Django 模闆語言 (DTL))和流行的替代方案 Jinja2 提供了内置後端。其他模闆語言的後端可從第三方獲得。

Django 定義了一個标準的 API,用于加載和渲染模闆,與後端無關。加載包括查找給定辨別符的模闆并對其進行預處理,通常将其編譯為記憶體中的表示形式。渲染意味着用上下文資料插入模闆并傳回結果字元串。

Django 模闆語言是 Django 自己的模闆系統。推薦使用 DTL。由于曆史原因,對模闆引擎的通用支援和 Django 模闆語言的實作都位于 django.template 命名空間中。

建立模闆template

在 mysite 目錄下建立 templates 目錄,并添加 index.html 檔案,目錄結構如下:

Python Django Web 架構程式設計 - 模闆 templates

為了讓 Django 模闆引擎能夠找到 templates 路徑,需要在 mysite/settings.py 檔案中的 templates 節點,設定DIRS 内容。DIRS 定義了一個目錄清單,引擎應該在其中按搜尋順序查找模闆源檔案。在下圖中設定了 templates 路徑在項目的根目錄下。

Python Django Web 架構程式設計 - 模闆 templates

Django 模闆語言

Django 模闆隻是使用 Django 模闆語言标記的文本文檔或 Python 字元串。一些構造被模闆引擎識别和解釋。主要的是變量和标簽。

使用上下文呈現模闆。渲染用它們的值替換變量,這些值在上下文中查找,并執行标簽。其他一切都按原樣輸出。

Django 模闆語言的文法涉及四個部分:

變量

變量從上下文中輸出一個值,它是一個類似字典的對象,将鍵映射到值。

變量被 {{ 和 }} 包圍,如下所示:

My first name is {{ first_name }}. My last name is {{ last_name }}.           

使用 {'first_name': 'John', 'last_name': 'Doe'} 的上下文,此模闆呈現為:

My first name is John. My last name is Doe.           

字典查找、屬性查找和清單索引查找是用點符号實作的:

{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}           

标簽

标簽在渲染過程中提供任意邏輯。這個定義故意含糊不清。例如,标簽可以輸出内容,用作控制結構,例如“if”語句或“for”循環,從資料庫中擷取内容,甚至啟用對其他模闆标簽的通路。

标簽被 {% 和 %} 包圍,如下所示:

{% csrf_token %}           

一些标簽需要開始和結束标簽:

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}           

過濾器

過濾器轉換變量和标簽參數的值。它們看起來像這樣:

{{ django|title }}           

使用 {'django': 'the web framework for perfectionists with deadlines'} 的上下文,此模闆呈現為:

The Web Framework For Perfectionists With Deadlines           

一些過濾器接受一個參數:

{{ my_date|date:"Y-m-d" }}           

使用模闆語言變量輸出動态内容到頁面

在模闆檔案 index.html 中輸入下列内容:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
   <h1>{{ title }}</h1>
		        <div>My first name is {{ first_name }}. My last name is {{ last_name }}.</div>
</body>
</html>           

其中 title,first_name,last_name 都是變量。需要從 view 中傳遞變量的值過來。

那麼就需要對 polls/views.py 的 index() 進行修改。這裡就需要用到 render 對模闆進行資料渲染:

from django.shortcuts import render

#通過模闆語言的變量進行傳遞資訊
def index(request):
    context = {'title':'我的站點' ,'first_name': '乙丙', 'last_name': '白'}
    return render(request, 'index.html', context)           

儲存之後。在浏覽器中通路:http://127.0.0.1:8000/polls/。可以看到如下界面内容:

Python Django Web 架構程式設計 - 模闆 templates