Django過濾器
Django過濾器是一種用於在Django模板中處理數據的技術。過濾器的作用是可以對模板中的變量進行加工、過濾或格式化,返回一個新的值供模板使用。
過濾器語法
過濾器作用是在變量輸出時,對輸出的變量值做進一步的處理。
我們可以使用過濾器來更改變量的輸出顯示。
過濾器跟模板標籤一樣,也是在模板中對函數進行調用
對輸出的日期進行格式化處理,或者轉換大小寫字母等,這些都有對應的過濾器去處理它們。
當內置過濾器滿足不了需求的情況下,也可自定義過濾器。
過濾器的語法格式如下:
{{ 變量 | 過濾器1:參數值1 | 過濾器2:參數值2 ... }}
1
從語法格式我們可以得知過濾器使用|管道符進行變量與過濾器之間的連接,過濾器的可以通過組合多個過濾器實現鏈式調用,目前過濾器最多接受一個參數。
經常使用的過濾器如下表所示:
常見的模板過濾器
過濾器 使用說明
length 獲取變量的長度,適用於字符串和列表
lower/upper 轉換字符串爲小寫/大寫形式
first/last 獲取變量的首個/末尾元素
add:‘n’ 給變量值增加 n
safe 默認不對變量內的字符串進行html轉義
cut 從給定的字符串中刪除指定的值
dictsort 獲取字典列表,並返回按參數中給定鍵排序的列表
join 用字符串連接列表,例如 Python 的 str.join(list)
truncatewords 如果字符串字符多於指定的字符數量,那麼會被截斷。 截斷的字符串將以可翻譯的省略號序列(“…”)結尾
過濾器應用
過濾器相比模板標籤要簡單的多,我們可以把它們理解成一個 Python函數,傳遞參數給他處理就可以了,當濾器接收參數後對它進行處理,最終將處理結果返回到模板中,這就是整個過濾器的實現流程,下面我們通過一些具體的實例,來更加詳細理解它的使用方法。
獲取變量的長度
我們使用 length 過濾器得到變量的長度:
# 數據
{'world':'xx'}
# 過濾器
<p>hello:{{world|length}}</p>
1
2
3
4
5
截取指定個數的詞
truncatewords 它允許你截斷字符串中的單詞(word)的數量,以防止字符串內容過長。
該過濾器語法如下:
在一定數量的單詞後截斷字符串,語法格式如下所示:
# 數據
{'value':'Django is website'}
# 過濾器
<p>{{ value|truncatewords:2 }}</p>
1
2
3
4
5
返回指定鍵的排序列表
dictsort 它指定字典的鍵爲參數,最後返回按照指定鍵排序的列表,它的用法如下所示:
# 數據
{'value':[
{'name': 'C語言', 'num':2 },
{'name': 'Django官網', 'num': 1},
{'name': 'Python官網', 'num': 3},
]}
# 過濾器
<p>hello:{{value|dictsort:"num"}}</p>
1
2
3
4
5
6
7
8
9
從輸出的結果可以看出 dictsort 過濾器對指定的鍵 num 做了排序處理。
當然過濾器也可以與模板標籤配合使用,這種屬於綜合的使用方法,實例如下:
# 數據
{'books':[
{'title': 'C語言', 'author': {'name': 'ycs', 'age': 14}},
{'title': 'Python教程', 'author': {'name': 'xxw', 'age': 17}},
{'title': 'Django教程', 'author': {'name': 'ccs', 'age': 16}},
]}
# 過濾器
{% for book in books|dictsort:"author.age" %}
<p>{{ book.title }} ({{ book.author.name }})</p>
{% endfor %}
1
2
3
4
5
6
7
8
9
10
11
add給變量值加“n”
add 過濾的用法也非常的簡單,變量值是整型而且參數也是整型,此時的 add 過濾器相當於加法運算.
但是如果變量值和參數都是列表又會怎麼樣呢,讓我們通過下面的例子來看一下:
# 數據
{'value':'5'}
# 過濾器
{{ value|add:2 }}
# 數據
{'value':['python','Django','Flask'],'list':['Tonado','celery']}
# 過濾器
{{value|add:list}}
1
2
3
4
5
6
7
8
9
add過濾器將首先嚐試將兩個值都強制轉換爲整數。如果失敗,它將嘗試將所有值加在一起。這將對某些數據類型(如字符串,列表等)起作用,而對其他數據類型則失敗。如果失敗,結果將爲空字符串。
Django url標籤
在 Django 的模板語言中除了我們前面章節介紹過的 if 標籤和 for 標籤之外,還有許多我們時常用到標籤。
url標籤
Django 的模板語言爲我們提供了 url 標籤,url 標籤可以避免在模板中使用硬編碼的方式插入要訪問的 url 地址。
所謂硬編碼就是將數據直接嵌入到程序或其他可執行對象的源代碼中,比如我們修改了視圖的訪問地址,如果模板中採用的是硬編碼的話,那麼也需要對模板中的訪問地址url 進行修改,讓它們保持數據的一致,但是這樣對於採用 MTV 設計模式的 Django 框架來說是極其不方便的。
url 標籤就很好的避免了這一點,它的使用語法格式如下:
{% url 'url_name' args1 args2 %}
1
我們解析一下它的的含義,其中 app_name 代表我們創建的應用的名字此處是index;url_name 是 url
自定義的別名,可以在配置路由地址時通過 path 的 name 屬進行設置。而後面的args1、args2 參數是用於定義動態的 url即帶有查詢的字符串的 url。下面我們通過已經講過的實例代碼對 url 標籤進行講解。
總路由:
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', include('index.urls')),
]
1
2
3
4
首先我們在urls.py文件中爲url設置別名,如下所示:(子路由)
urlpatterns = [
path('Hello_MyWeb/', views.Hello_MyWeb, name='hello'),
path('test_url/', views.test_url)
]
1
2
3
4
然後我們在 templates 目錄下創建一個名爲 test_url 的 html 文件,添加一下代碼:
<p><a href="{% url 'hello' %}" >點我查看django課程</a></p>
1
最後我們在 views.py 文件中創建一個 test_url 函數,如下所示:
def test_url(request):
return render(request, 'test_url.html')
1
2
在瀏覽器地址欄訪問 127.0.0.1:8000/index/test_url/ ,通過點擊可以跳轉到 Hello_MyWeb頁面。如果你想跳轉到其他的頁面,只需要將給相應路由配置 name 屬性即可,而我們無需做其他的改動。name 參數有非常重要作用,url 的反向解析也是通過它與reverse()函數配合使用實現的。這個知識點後續還會講到。
動態url
首更改 path 路由函數映射關係,如下所示:
path('Hello_MyWeb/<int:id>', views.Hello_MyWeb, name='hello')
1
改動 Hello_MyWeb 視圖函數,爲其添加 id 參數,如下所示:
def Hello_MyWeb(request, id):
1
再把模板中的標籤改寫成如下格式:
<p><a href="{% url 'hello' 1 %}" >點我查看django課程</a></p>
1
Django自定義標籤
通過前面幾節的內容,我們對 Django 內置的模板標籤與過濾器做了深入的探討學習。
Django 雖然內置了二十多種標籤和六十多種過濾器,但是爲了給 Web 開發者提供更好使用體驗,Django也提供了自定義標籤與過濾器的功能。當內置標籤與過濾器滿足不了實際業務的需求,那麼我們就可以通過自定義的方式去實現,在本節我們將對如何實現自定義標籤進行講解。
如何自定義標籤
自定義標籤可以分爲三種類型:簡單標籤(simple_tag)、引用標籤(inclusion_tag)、賦值標籤(assignment_tag),在本節我們對它們進行詳細的描述。
定義之前的準備工作
Django 爲我們提供了自定義的機制,我們可以通過使用 Python 代碼來自定義標籤來,最後使用{% load %}標籤進行加載。
但是在自定義標籤之前,需要我們做一些準備工作,如下所示:
創建專門的應用來裝載自定義標籤或者在原始 app 上進行自定義,在這裏我們依舊使用原有的 index 應用;
在 index 應用下創建名爲 templatetags(名字不能變) 的 Python 包 ,並在包中新建__init__.py文件;
在新建的 Python 包中新建一個名爲 index_tags.py 文件,該文件命名時避免與內置標籤與過濾器名字衝突;
在 INSTALLED_APPS 列表中註冊 app,因爲 index 應用之前已經註冊,所以就無須操作了,若是新建的 app 就需要註冊。
給 index_tags.py 文件命名時,需要注意不能與 Django 內置的標籤或者過濾器名字衝突,如同 Python中命名不可以使用關鍵字一樣,所以我們在命名時應該儘量使用帶有下劃線的命名方式,這樣可以確保名字不衝突。
上述操作完成後,我們就可以使用{% load index_tags %}加載自定義標籤了,loda標籤將加載指定的的自定義標籤,但是templatetags目錄中自定義標籤或者過濾器的數量是沒有限制的,你可以根據自己實際需求進行構建。
模塊變量register
要在模塊內自定義標籤,該模塊必須包含一個名爲 register 的模板層變量,且它的值是 template.Library 的實例,所有的標籤和過濾器都是在其中註冊的。
所以我們需要打開 index_tags.py 文件,並在文件頂部加上如下代碼:
from django import template
register = template.Library()
1
2
自定義標籤
簡單標籤通過接收參數,對輸入的參數做一些處理並返回結果。
如下所示,在 index_tags .py 文件中定義 addstr_tag 標籤:
#註冊自定義簡單標籤
@register.simple_tag
def addstr_tag(strs):
return 'Hello%s' % strs
1
2
3
4
addstr_tag 函數使用 register.simple_tag 進行裝飾,目的是能夠將 addstr_tag 註冊到模板系統中。
然後我們就可以使用 {% load %} 加載自定義的標籤了,使用如下方式:
{% load index_tags %}
1
加載之後我們就可以使用我們的自定義標籤了,通過舉例看一下實際的效果:
我們直接在test_url.html嘗試:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p><a href="{% url 'hello' 1 %}" >點我查看django課程</a></p>
<p>
{% load index_tags %}
{% addstr_tag 'Django BookStore' %}
</p>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
賦值標籤
這個標籤類似於簡單標籤,使用 register.simple_tag 進行註冊,但它並不會直接輸出結果,而是使用 as
關鍵字將結果儲存在指定的上下文變量中,從而降低了傳輸上下文的成本。
下面在 index_tags.py 中定義test_as_tag 標籤,如下所示:
#註冊自定義賦值標籤
@register.simple_tag
def test_as_tag(strs):
return 'Hello Test Tag-%s'%strs
1
2
3
4
使用自定義賦值標籤,實例如下所示:
我們直接在test_url.html嘗試:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p><a href="{% url 'hello' 1 %}" >點我查看django課程</a></p>
{% load index_tags %}
{% test_as_tag 'django課堂歡迎你' as test %}
<p>{{ test }}</p>
</body>
</html>
————————————————
標籤 | 說明 |
---|---|
autoescape | 自動轉義開關 |
block | 塊引用 |
comment | 註釋 |
csrf_token | CSRF令牌 |
cycle | 循環對象的值 |
debug | 調試模式 |
extends | 繼承模版 |
filter | 過濾功能 |
firstof | 輸出第一個不爲False的參數 |
for | 循環對象 |
for … empty | 帶empty說明的循環 |
if | 條件判斷 |
ifequal | 如果等於 |
ifnotequal | 如果不等於 |
ifchanged | 如果有變化,則.. |
include | 導入子模版的內容 |
load | 加載標籤和過濾器 |
lorem | 生成無用的廢話 |
now | 當前時間 |
regroup | 根據對象重組集合 |
resetcycle | 重置循環 |
spaceless | 去除空白 |
templatetag | 轉義模版標籤符號 |
url | 獲取url字符串 |
verbatim | 禁用模版引擎 |
widthratio | 寬度比例 |
with | 上下文變量管理器 |