Django之Template介紹及日常應用

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哦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容