1. 程式人生 > >DTL常用過濾器詳解

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\_nonedefault只有一點區別,default是所有被評估為False的都會使用預設值。而default_if_none則只有這個值是等於None的時候才會使用預設值。
[]""{}等都不會顯示預設值,而是直接顯示原來的空字元竄或空字典,空列表等。

first過濾器

返回列表/元組/字串中的第一個元素。

{{ value|first }}

如果value是等於['a','b','c'],那麼輸出將會是a

last過濾器

返回列表/元組/字串中的最後一個元素。

{{ value|last }}

如果value是等於['a','b','c'],那麼輸出將會是c

floatformat過濾器

使用四捨五入的方式格式化一個浮點型別。如果這個過濾器沒有傳遞任何引數。那麼只會在小數點後保留一個小數,如果小數後面全是0,那麼只會保留整數。當然也可以傳遞一個引數,標識具體要保留幾個小數。

  1. 如果沒有傳遞引數:
value 模版程式碼 輸出
34.23234 {{ value\|floatformat }} 34.2
34.000 {{ value\|floatformat }} 34
34.260 {{ value\|floatformat }} 34.3
  1. 如果傳遞引數:
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。如果valueNone,那麼以上將返回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_list2開始做切片操作。到some_list的最後。

{{ some_list|slice:"2:50:3" }}

上面程式碼表示給some_list2進行切片操作,到some_list50結束,步數為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>

想了解更多關於Django的過濾器的可以檢視Django官方文件

還可以看一下這個視訊超細講解Django打造大型企業