Django模板語言
Django模板是一個簡單的文本文檔,或用Django模板語言標記的一個Python字符串。 某些結(jié)構(gòu)是被模板引擎解釋和識別的。主要的有變量和標簽。模板是由context來進行渲染的。渲染的過程是用在context中找到的值來替換模板中相應的變量,并執(zhí)行相關(guān)tags。其他的一切都原樣輸出。Django模板語言的語法包括四個結(jié)構(gòu)。
Django 項目可以配置一個或多個模板引擎(甚至是零,如果你不需要使用模板)。Django 的模板系統(tǒng)自帶內(nèi)建的后臺 —— 稱為Django 模板語言(DTL),以及另外一種流行的Jinja2。其他的模板語言的后端,可查找第三方庫。
配置
模板引擎通過TEMPLATES 設置來配置。它是一個設置選項列表,與引擎一一對應。默認的值為空。由startproject 命令生成的settings.py ?定義了一些有用的值:
TEMPLATES = [
? ? {
? ? ? ? 'BACKEND': 'django.template.backends.django.DjangoTemplates',
? ? ? ? 'DIRS': [],
? ? ? ? 'APP_DIRS': True,
? ? ? ? 'OPTIONS': {
? ? ? ? ? ? # ... some options here ...
? ? ? ? },
? ? },
?]
加載模板
get_template('news/story_detail.html')
1 變量(使用雙大括號來引用變量)
{{ var_name }}
2 標簽(tag)的使用(使用大括號和百分號組成來表示使用tag)
{% load staticfiles %}
3 過濾器(filter)的使用
{{ ship_date|date:"Fj,Y"}}
ship_date變量傳給data過濾器,data過濾器通過使用Fj,Y這幾個參數(shù)來格式化數(shù)據(jù)。|代表類似Unix命令中的管道操作。
?常用標簽(tag)
1 {% if %}
可以使用and,or,not來組織你的邏輯,但不允許and和or同時出現(xiàn)的條件語句中。新版本已經(jīng)支持{% elif %}這樣的用法
2 {% ifequal %}和{% ifnotequal %}
比較是否相等,只限于簡單的類型,比如字符串、整數(shù)、小數(shù)的比較,列表、字典、元組不支持。
3 {% for %}
用來循環(huán)一個list,還可以使用reserved關(guān)鍵字來進行倒序遍歷,一般可以用if語句來西先判斷一下列表是否為空,在進行遍歷;還可以使用empty關(guān)鍵字來進行為空時候的跳轉(zhuǎn)。
**for標簽中可以使用forloop
forloop.counter: 當前循環(huán)計數(shù),從1開始
forloop.counter0: 當前循環(huán)計數(shù),從0開始
forloop.recounter: 當前循環(huán)倒數(shù)計數(shù),從列表長度開始
forloop.recounter0: 當前循環(huán)倒數(shù)計數(shù),從列表長度減1開始,標準
forloop.first: bool值,判斷是不是循環(huán)的第一個元素
forloop.last: bool值,判斷是不是循環(huán)的最后一個元素
forloop.parentloop: 用在嵌套循環(huán)中,得到parent循環(huán)的引用,然后可以使用以上參數(shù)
4 {% cycle %}
在循環(huán)是輪流使用給定的字符串列表中的值。
5 注釋
{# #}單行注釋,{% comment %}多行注釋
6 {% csrf_token %}
生成csrf_token的標簽,用于防止跨站攻擊驗證
7 {% debug %}
調(diào)用調(diào)試信息
8 {% filter %}
將filter標簽標簽圈定的執(zhí)行過濾器操作
9 {% autoescape %}
自動轉(zhuǎn)義設置
{{% autoescape off %}}
{{ value}}
{{% endautoescape %}}
10 {% firstof %}
輸出第一個值不等于False的變量
11 {% load %}
加載標簽庫
12 {% now %}
獲取當前的時間
13 {% spaceless %}
移除空格
14 {% url %}
引入路由配置的地址
15 {% verbatim %}
禁止render
16 {% with %}
用更簡單的變量名緩存復制的變量名
常用過濾器(filter)
經(jīng)常使用的是通過變量來調(diào)用過濾器)
1 add
給變量加上相應的值
{{ value|add:"2" }}? ? # 空格不要亂加
2 addslashes
給變量中的引號(雙引號、單引號)前加上斜線
3 capfirst
首字母大寫
4 cut
從字符串中移除指定的字符
{{ value|cut:" " }}
5 date
格式化日期字符串
6 default
如果值是False,就替換成設置的默認值,否則就使用本來的值(空字符串”“、空列表[]、空字典{}、空元組()、None在python里也是False)
7 default_if_none
如果只是None,就替換成設置的默認值,否則就使用本來的值
8 dictsort
按照設定的參數(shù)(key)對應的value對列表進行排序
9 dictsorted
和上面恰好相反
10 divisbleby
是否能夠被某個數(shù)字整除,是的話返回True,否則返回False
11 escape
對字符串進行轉(zhuǎn)義。django默認自動轉(zhuǎn)義,如果我們關(guān)閉了自動轉(zhuǎn)義,這可使用escape過濾器來轉(zhuǎn)義。
12 escapejs
替換value中的某些字符,以適應JAVASCRIPT和JSON格式
13 filesizeformat
格式化文件大小顯示
14 first
返回列表中的第一個值
15 last
返回列表中的最后一個值
16 floatformat
格式化浮點數(shù)
17 length
求字符串或者列表的長度
18 length_is
比較字符串或者列表的長度
19 urlencode
對URL進行編碼處理
20 upper\lower
大寫\小寫
21 safe
對某個變量關(guān)閉自動轉(zhuǎn)義
{{ value|safe }}
22 slice
切片操作
{{ some_list|slice:":2" }}
23 time
格式化時間
24 timesince
格式化時間(e.g. “4 days,6 hours”)
25 truncatechars
按照字符截取字符串
{{ value|truncatechars:5 }}
26 turncatewords
按照單詞截取字符串(其實就是按照空格來截取)
27 striptags
過濾掉html標簽
具體可以查看 內(nèi)置過濾器參考和 開發(fā)自定義過濾器指南這兩篇文檔.
include模板
{% include 'included.html' %}標簽允許在模板中包含其它的模板的內(nèi)容。
模板繼承
模板可以通過繼承來實現(xiàn)復用。首先編寫base.html
<html>
? <head>
? ? <title>Hello World!</title>
? </head>
? <body>
? ? {% block mainbody %}
? ? ? <p>base</p>
? ? {% endblock %}
? </body>
</html>
{% block %}標簽通知模板引擎,子模板可以重寫這些部分。
{% extends "base.html" %}
{% block mainbody %}
? ? <p>extends base</p>
{% endblock %}
模版繼承可以讓您創(chuàng)建一個基本的“骨架”模版,它包含您站點中的全部元素,并且可以定義能夠被子模版覆蓋的 blocks 。
加載器
模板加載器負責定位模板,加載它們,并返回模板對象.
Django提供幾個內(nèi)置的模板加載器并且支持自定義的模板加載器.
上下文處理器
Context處理器是這樣的函數(shù):接收當前的?HttpRequest 作為參數(shù),并返回一個?字典,該字典中包含了將要添加到渲染的context中的數(shù)據(jù)。
它們的主要用途是添加所有的模板context共享的公共數(shù)據(jù),而不需要在每個視圖中重復代碼。
Django提供了很多 內(nèi)置的context處理器 . 實現(xiàn)自定義context處理器很簡單,只要定義一個函數(shù)。
大家使用Django的模板的時候可能都用過{{request.user}}來獲取登錄的用戶或者判斷是否登錄呢?那大家有沒有想過,我們調(diào)用render方法的時候并沒有把request對象作為參數(shù)傳給模板啊,為什么就可以直接調(diào)用呢?答案就是Django默認自帶了一些context_processors幫我們把request對象傳給模板,我們來看一下settings.py這一段代碼
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'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',
],
},
},
]
這里面的context_processors就是配置模板有哪些context_processors可以使用。其中django.template.context_processors.request就是幫我們把request傳遞給模板的,我們來看一下
def request(request):
return {'request': request}
可以看到,首先context_processors就是一個函數(shù),其次,這個函數(shù)默認接受一個參數(shù),也就是request,最后,返回的對象是一個字典,字典的key就是我們在模板里面可以調(diào)用的一個上下文。
那么我們來建一個自己的context_processors
創(chuàng)建context_processors
首先我們在自己app里創(chuàng)建一個context_processors.py的文件(模塊),文件名雖然不是強制要求,但作為規(guī)范,建議還是按照規(guī)范來
然后里面實現(xiàn)一個context_processors的函數(shù),比如我們就是把settings里的某一個參數(shù)作為上下文返回,可以這樣寫
from django.conf import settings # import the settings file
def site_name(request):
# return the value you want as a dictionnary. you may add multiple values in there.
return {'SITE_NAME': settings.SITE_NAME}
說明:settings.SITE_NAME是一個自定義的配置,默認并不存在,需要我們手動寫。另外可以返回多個值,只要配置多個key和value對兒就可以了。
注意:request形參必須有,盡管多數(shù)用不到。
配置context_processors
接下來就可以把我們自定義的context_processors添加到配置文件中
TEMPLATES = [
接下來就可以把我們自定義的context_processors添加到配置文件中
TEMPLATES = [
{
...
'OPTIONS': {
說明:blog是這個例子的應用名,根據(jù)自己的項目做相應修改。
注意:別忘了配置SITE_NAME哦。
大功告成
這樣我們就可以在我們的模板通過{{SITE_NAME}}等方式調(diào)用這個參數(shù)了
'context_processors': [
...
'blog.context_processors.site_name',
],
},
},
]
...
SITE_NAME = "社區(qū)"
{
...
'OPTIONS': {
'context_processors': [
...
'blog.context_processors.site_name',
],
},
},
]
...
SITE_NAME = "社區(qū)"
說明:blog是這個例子的應用名,根據(jù)自己的項目做相應修改。
注意:別忘了配置SITE_NAME哦。