DTL常用過濾器詳解
什麼是過濾器?
通俗的說,過濾器就是一個函式,可以對需要處理的引數進行處理,並且還可以額外接收一個引數(也就是說,最多隻能有2個引數)。
為什麼要使用過濾器?
因為在DTL中,不支援函式的呼叫形式,因此不能給函式傳遞引數,這將有很大的侷限性。所以需要使用過濾器來進行對引數的處理。
add過濾器
新建一個filter_demo
的專案,然後在和manage.py
同級目錄下的filter_demo
下新建一個views.py的檔案。
然後在templates中新建一個add.html
的檔案。如果沒有這個目錄的話,就需要手動建立。並且配置路徑。
然後首先在views中寫入程式碼:
from django.shortcuts import render
def add_view(request):
context = {
'value1': ['1','2','3'],
'value2': ['4','5','6']
}
return render(request,'add.html',context=context)
配置url,即urls中寫入:
from django.urls import path
from . import views
urlpatterns = [
path( 'add/',views.add_view),
]
add.html中的body中寫入程式碼:
{{ 1 | add:2 }}<br>
{{ 1 | add:'2' }}<br>
{{ 9999 | add:'lalala' }}<br>
{{ '9999' | add:'lalala' }}<br>
{{ value1 | add:value2 }}<br>
注意: add後面不要有空格,否則會因為不能被識別而報錯。
檢視效果圖
為了瞭解過濾器是怎樣過濾的,我們按住
ctrl鍵單擊
add``,就能進入add函式的原始碼中了。add函式原始碼如下
def add(value, arg):
"""Add the arg to the value."""
try:
return int(value) + int(arg)
except (ValueError, TypeError):
try:
return value + arg
except Exception:
return ''
add過濾器前面一個是值
,後面一個是引數
。
它會將傳進來的引數新增到原來的值上面。這個過濾器會嘗試將值
和引數
轉換成整形然後進行相加。如果轉換成整形過程中失敗了,那麼會將值
和引數
進行拼接。如果是字串,那麼會拼接成字串,如果是列表,那麼會拼接成一個列表。如果這兩個都不是的話,就會返回一個空的字元竄。正好和上面的效果圖對應上了。
cut過濾器
在templates中新建一個cut.html
的檔案,
然後在views中新增函式cut_view
的函式
def cut_view(request):
return render(request,'cut.html')
cut.html
中的body中寫入程式碼:
{{ "hello world" |cut:" " }}
然後按住ctrl
鍵點選cut檢視原始碼:
def cut(value, arg):
"""Remove all values of arg from the given string."""
safe = isinstance(value, SafeData)
value = value.replace(arg, '')
if safe and arg != ';':
return mark_safe(value)
return value
由原始碼我們可以看出,cut
過濾器相當於python中replace(arg,' ')
函式,和add
過濾器一樣,前一個是值
,後一個是引數
,即在傳入的值
中尋找引數
,如果找到了,就將它進行剪下掉。就像上面的程式碼中我們就將hello world
中的空格進行了裁剪。
date過濾器
在templates中建立一個date.html
的檔案,
然後在views中建立一個函式:
from django.shortcuts import render
from datetime import datetime
def date_view(request):
#獲取當前的時間
nowTime = datetime.now()
return render(request,'date.html',{'nowTime':nowTime})
新增url對映,
path('date/',views.date_view),
date.html
中寫入程式碼:
{{ nowTime }}<br>
{{ nowTime |date:'Y/m/d h:i:s' }}<br>
{{ nowTime |date:'Y-m-d' }}<br>
{{ nowTime |date:'d-m-Y' }}<br>
然後我們就能檢視到效果了
總結:date過濾器就是對時間的格式化輸出。
下面列舉出部分的引數,這些引數不用記憶,需要使用的時候進行檢視就行了。
格式字元 | 描述 | 示例 |
---|---|---|
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 |
想了解更多的時間格式化的方式可以檢視django官方文件
default過濾器
views中新建一個函式
def default_view(request):
context = {
'value':'hello',
}
return render(request,'default.html',context=context)
新增url對映,
path('default/',views.default_view),
在templates中新建一個default.html
的檔案,然後在body中寫入程式碼
{{ value |default:'我是預設值' }}
這樣,我們就可以修改value中的值來進行測試。如果我們的value
被判定為False時,就會顯示‘我是預設值’
如[]
,""
,None
,{}
等這些在if
判斷中為False
的值,都會使用default
過濾器提供的預設值。
注意: 不是將預設值賦值給value,只是顯示預設值。
default_if_none過濾器
default\_if\_none
和default
只有一點區別,default
是所有被評估為False
的都會使用預設值。而default_if_none
則只有這個值是等於None
的時候才會使用預設值。
如[]
,""
,{}
等都不會顯示預設值,而是直接顯示原來的空字元竄或空字典,空列表等。
first過濾器
返回列表/元組/字串中的第一個元素。
{{ value|first }}
如果value
是等於['a','b','c']
,那麼輸出將會是a
。
last過濾器
返回列表/元組/字串中的最後一個元素。
{{ value|last }}
如果value
是等於['a','b','c']
,那麼輸出將會是c
。
floatformat過濾器
使用四捨五入的方式格式化一個浮點型別。如果這個過濾器沒有傳遞任何引數。那麼只會在小數點後保留一個小數,如果小數後面全是0,那麼只會保留整數。當然也可以傳遞一個引數,標識具體要保留幾個小數。
- 如果沒有傳遞引數:
value | 模版程式碼 | 輸出 |
---|---|---|
34.23234 | {{ value\|floatformat }} |
34.2 |
34.000 | {{ value\|floatformat }} |
34 |
34.260 | {{ value\|floatformat }} |
34.3 |
- 如果傳遞引數:
value | 模版程式碼 | 輸出 |
---|---|---|
34.23234 | {{value\|floatformat:3}} |
34.232 |
34.0000 | {{value\|floatformat:3}} |
34.000 |
34.26000 | {{value\|floatformat:3}} |
34.260 |
join
類似與Python
中的join
,將列表/元組/字串用指定的字元進行拼接。示例程式碼如下:
{{ value|join:"/" }}
如果value
是等於['a','b','c']
,那麼以上程式碼將輸出a/b/c
。
length
獲取一個列表/元組/字串/字典的長度。示例程式碼如下:
{{ value|length }}
如果value
是等於['a','b','c']
,那麼以上程式碼將輸出3
。如果value
為None
,那麼以上將返回0
。
lower
將值中所有的字元全部轉換成小寫。示例程式碼如下:
{{ value|lower }}
如果value
是等於Hello World
。那麼以上程式碼將輸出hello world
。
upper
類似於lower
,只不過是將指定的字串全部轉換成大寫。
random
在被給的列表/字串/元組中隨機的選擇一個值。示例程式碼如下:
{{ value|random }}
如果value
是等於['a','b','c']
,那麼以上程式碼會在列表中隨機選擇一個。
safe
標記一個字串是安全的。也即會關掉這個字串的自動轉義。示例程式碼如下:
{{value|safe}}
如果value
是一個不包含任何特殊字元的字串,比如<a>
這種,那麼以上程式碼就會把字串正常的輸入。如果value
是一串html
程式碼,那麼以上程式碼將會把這個html
程式碼渲染到瀏覽器中。
slice
類似於Python
中的切片操作。示例程式碼如下:
{{ some_list|slice:"2:" }}
以上程式碼將會給some_list
從2
開始做切片操作。到some_list
的最後。
{{ some_list|slice:"2:50:3" }}
上面程式碼表示給some_list
從2
進行切片操作,到some_list
的50
結束,步數為3
,即每隔3
個選取一個元素。
注: slice
和python中的語法是一樣的。
stringtags
刪除字串中所有的html
標籤。示例程式碼如下:
{{ value|striptags }}
如果value
是<strong>hello world</strong>
,那麼以上程式碼將會輸出hello world
。
truncatechars
如果給定的字串長度超過了過濾器指定的長度。那麼就會進行切割,並且會拼接三個點來作為省略號。示例程式碼如下:
{{ value|truncatechars:5 }}
如果value
是等於北京歡迎您~
,那麼輸出的結果是北京...
。可能你會想,為什麼不會北京歡迎您...
呢。因為三個點也佔了三個字元,所以北京
+三個點的字元長度就是5。
truncatechars_html
類似於truncatechars
,只不過是不會切割html
標籤。示例程式碼如下:
{{ value|truncatechars:5 }}
如果value
是等於<p>北京歡迎您~</p>
,那麼輸出將是<p>北京...</p>
。