定義
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=https://www.cnblogs.com/tynam/p/"{ % url 'urlname' % }"></a>
也可以在 url 中添加引數:
<a href=https://www.cnblogs.com/tynam/p/"{ % 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=https://www.cnblogs.com/tynam/p/"{ % static 'style.css' % }">
6、如果不想每次在模板中加載靜態檔案使用 load 加載 static 標簽,那么可以在 settings 中的 TEMPLATES/OPTIONS 中添加內置標簽,builtins
'builtins':['django.templatetags.static']
7、如果沒有在 settings 下的 INSTALLED_APPS 中添加 django.contrib.staticfiles ,那么需要手動將請求靜態檔案的 url 與靜態檔案的路徑進行映射,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/219388.html
標籤:Python
上一篇:大廠是怎么進行SQL調優的?
