定義
DTL(django Tempalte language)是Django自帶的模板語言。 Django支援Jinja2等其他模板引擎。DTL模板是一種帶有特殊語法的HTML檔案,可以被Django編譯,產地引數,實現資料動態化。在編譯完成後,生成一個普通的HTML檔案,然後傳送給客戶端。
在 Django 中提供了 render ,直接將模板渲染成字串和包裝成HttpResponse物件。views 下的示例如下:
def index(request): return render(request,'index.html')
模板查詢順序
新新增的 app 需要在 settings 進行註冊:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'book', ]
模板檔案查詢:
首先會在專案的 templates 下查詢。
其次在自己所在的 app下的 templates 中查詢。
最後在其他的 app下 查詢。
如果下面的程式碼中的 APP_DIRS 的值為 False,則不會在 app下進行查詢,只會在專案的 templates 下查詢。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
引數傳遞
在 render 中有context 引數作為引數的傳遞。
例如 views 為:
def index(request): context = { 'username': 'ty' } return render(request,'index.html', context=context)
在html中使用兩個大括號{{ "變數" }} 進行引用:
<body>
{{ username }}
</body>
如果是有層級關係,例如類中的變數,則可以使用點 class.value 進行獲取。
例如字典,也可以使用點進行獲取 dict.key 。但是如果使用 dict.keys 獲取到的是字典的所有 key。不能通過中括號[]的形式進行獲取。
例如列表,可以使用下標進行獲取 list.index 。元組也是一樣的。
常用標籤
if 標籤:也可以結合 else 一起使用,但是需要有結束表示 endif,可以使用基本運算子 == ,!=, >= 等。
{% if number < 1 %} <p>小於1</p> {% if number == 1 %} <p>等於1</p> {% else %} <p>大於1</p> {% endif %}
for 標籤:與 Python 的 for 語句的情形類似,迴圈語法是 for X in Y ,Y 是要迭代的序列而 X 是在每一個特定的迴圈中使用的變數名稱。每一次迴圈中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
url標籤
url 後面的為 path 中的 name 值。
<a href="{ % url 'urlname' % }"></a>
也可以在 url 中新增引數:
<a href="{ % url 'urlname' id='3' % }"></a>
過濾器
在DTL中不支援函式的呼叫形式,因此不能給函式傳遞引數。而過濾器其實就是一個函式,可以對需要處理的引數進行處理,並且可以額外接收一個引數。
add: 將傳進來的引數新增到原來的值上面。
{{ value|add:'3' }}
cut: 移除字串,類似於 replace 函式。
{{ value|cut:" " }}
date:日期格式,將一個日期按照制定格式,格式化成字串。
# 資料 context = { ”birthday“:datetiem.now() } # 模板 {{ birthday|date:"Y/m/d" }}
其他時間格式化的方式。
格式字元 |
描述 |
示例 |
Y |
四位數字的年份 |
2018 |
m |
兩位數字的月份 |
01-12 |
n |
月份,1-9前面沒有0字首 |
1-12 |
d |
兩位數字的天 |
01-31 |
j |
天,但是1-9前面沒有0字首 |
1-31 |
g |
小時,12小時格式的,1-9前面沒有0字首 |
1-12 |
h |
小時,12小時格式的,1-9前面有0字首 |
01-12 |
G |
小時,24小時格式的,1-9前面沒有0字首 |
1-23 |
H |
小時,24小時格式的,1-9前面有0字首 |
01-23 |
i |
分鐘,1-9前面有0字首 |
00-59 |
s |
秒,1-9前面有0字首 |
00-59 |
其他過濾器
過濾器 | 說明 |
---|---|
addslashes | 新增斜槓 |
capfirst | 首字母大寫 |
center | 文字居中 |
default | 設定預設值 |
default_if_none | 為None設定預設值 |
dictsort | 字典排序 |
dictsortreversed | 字典反向排序 |
divisibleby | 整除判斷 |
escape | 轉義 |
escapejs | 轉義js程式碼 |
filesizeformat | 檔案尺寸人性化顯示 |
first | 第一個元素 |
floatformat | 浮點數格式化 |
force_escape | 強制立刻轉義 |
get_digit | 獲取數字 |
iriencode | 轉換IRI |
join | 字元列表連結 |
last | 最後一個 |
length | 長度 |
length_is | 長度等於 |
linebreaks | 行轉換 |
linebreaksbr | 行轉換 |
linenumbers | 行號 |
ljust | 左對齊 |
lower | 小寫 |
make_list | 分割成字元列表 |
phone2numeric | 電話號碼 |
pluralize | 複數形式 |
pprint | 除錯 |
random | 隨機獲取 |
rjust | 右對齊 |
safe | 安全確認 |
safeseq | 列表安全確認 |
slice | 切片 |
slugify | 轉換成ASCII |
stringformat | 字串格式化 |
striptags | 去除HTML中的標籤 |
time | 時間格式化 |
timesince | 從何時開始 |
timeuntil | 到何時多久 |
title | 所有單詞首字母大寫 |
truncatechars | 截斷字元 |
truncatechars_html | 截斷字元 |
truncatewords | 截斷單詞 |
truncatewords_html | 截斷單詞 |
unordered_list | 無序列表 |
upper | 大寫 |
urlencode | 轉義url |
urlize | url轉成可點選的連結 |
urlizetrunc | urlize的截斷方式 |
wordcount | 單詞計數 |
wordwrap | 單詞包裹 |
yesno | 將True,False和None,對映成字串‘yes’,‘no’,‘maybe’ |
模板繼承
編寫一個公共 html 檔案,在子模板中繼承公共模組即可達到複用的目的。在子模組中使用 { % extends 'xxx.html' % }
在公共 html 檔案中,可以使用 block 作為一個介面,進行對公共模組區域的內容進行填充。填充後會覆蓋公共模組 block 中內容。
# 公共模組,block後面為block名稱 {% block blockname %} {% endblock %} # 子模組 { % extends 'xxx.html' % } {% block blockname %} {% endblock %}
如果公共模組中 block 中有部分內容不希望被覆蓋,則可新增 block.super 進行標識。
# 公共模組,block後面為block名稱 {% block blockname %} {{ block.super }} 這是不會被覆蓋的程式碼 {% endblock %}
載入靜態檔案
1、確保 django.contrib.staticfiles 已經新增到settings中的INSTALLED_APPS
2、確保settings中設定了 STATIC_URL = '/static/'
3、在已經安裝了的 app 下建立一個資料夾叫 static
4、如果一些靜態檔案是不和任何app掛鉤的,可以在 settings 中新增 STATICFILES_DIRS
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ]
5、在模板中使用 load 標籤載入 static 標籤。
{% load static %} <link rel="stylesheet" href="{ % static 'style.css' % }">
6、如果不想每次在模板中載入靜態檔案使用 load 載入 static 標籤,那麼可以在 settings 中的 TEMPLATES/OPTIONS 中新增內建標籤,builtins
'builtins':['django.templatetags.static']
7、如果沒有在 settings 下的 INSTALLED_APPS 中新增 django.contrib.staticfiles ,那麼需要手動將請求靜態檔案的 url 與靜態檔案的路徑進行對映。