雖然DTL給我們內置了許多好用的過濾器。但是有些時候還是不能滿足我們的需求。因此Django給我們提供了一個接口,可以讓我們自定義過濾器,實現自己的需求。
模版過濾器必須要放在app中,并且這個app必須要在INSTALLED_APPS中進行安裝。然后再在這個app下面創建一個Python包叫做templatetags。再在這個包下面創建一個python文件。比如app的名字叫做book,那么項目結構如下:
1
2
3
4
5
6
|
- book - views.py - urls.py - models.py - templatetags - my_filter.py |
在創建了存儲過濾器的文件后,接下來就是在這個文件中寫過濾器了。過濾器實際上就是python中的一個函數,只不過是把這個函數注冊到模板庫中,以后在模板中就可以使用這個函數了。但是這個函數的參數有限制,第一個參數必須是這個過濾器需要處理的值,第二個參數可有可無,如果有,那么就意味著在模板中可以傳遞參數。并且過濾器的函數最多只能有兩個參數。在寫完過濾器后,再使用django.template.Library對象注冊進去。示例代碼如下:
1
2
3
4
5
6
7
8
9
10
|
from django import template # 創建模板庫對象 register = template.Library() # 過濾器函數 def mycut(value,mystr): return value.replace(mystr) # 將函數注冊到模板庫中 register. filter ( "mycut" ,mycut) |
以后想要在模板中使用這個過濾器,就要在模板中load一下這個過濾器所在的模塊的名字(也就是這個python文件的名字)。示例代碼如下:
1
|
{ % load my_filter % } |
自定義時間計算過濾器:
有時候經常會在朋友圈、微博中可以看到一條信息發表的時間,并不是具體的時間,而是距離現在多久。比如剛剛,1分鐘前等。這個功能DTL是沒有內置這樣的過濾器的,因此我們可以自定義一個這樣的過濾器。示例代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# time_filter.py文件 from datetime import datetime from django import template register = template.Library() def time_since(value): """ time距離現在的時間間隔 1\. 如果時間間隔小于1分鐘以內,那么就顯示“剛剛” 2\. 如果是大于1分鐘小于1小時,那么就顯示“xx分鐘前” 3\. 如果是大于1小時小于24小時,那么就顯示“xx小時前” 4\. 如果是大于24小時小于30天以內,那么就顯示“xx天前” 5\. 否則就是顯示具體的時間 2017/10/20 16:15 """ if isinstance (value,datetime): now = datetime.now() timestamp = (now - value).total_seconds() if timestamp < 60 : return "剛剛" elif timestamp > = 60 and timestamp < 60 * 60 : minutes = int (timestamp / 60 ) return "%s分鐘前" % minutes elif timestamp > = 60 * 60 and timestamp < 60 * 60 * 24 : hours = int (timestamp / ( 60 * 60 )) return "%s小時前" % hours elif timestamp > = 60 * 60 * 24 and timestamp < 60 * 60 * 24 * 30 : days = int (timestamp / ( 60 * 60 * 24 )) return "%s天前" % days else : return value.strftime( "%Y/%m/%d %H:%M" ) else : return value register. filter ( "time_since" ,time_since) |
在模版中使用的示例代碼如下:
1
2
3
4
|
{ % load time_filter % } ... { % value|time_since % } ... |
為了更加方便的將函數注冊到模版庫中當作過濾器。也可以使用裝飾器來將一個函數包裝成過濾器。示例代碼如下:
1
2
3
4
5
6
|
from django import template register = template.Library() @register . filter (name = 'mycut' ) def mycut(value,mystr): return value.replace(mystr,"") |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.jianshu.com/p/4ceeee528430