django 自定義過濾器的實(shí)現(xiàn)
自定義模版過濾器
雖然DTL給我們內(nèi)置了許多好用的過濾器。但是有些時候還是不能滿足我們的需求。因此Django給我們提供了一個接口,可以讓我們自定義過濾器,實(shí)現(xiàn)自己的需求。
模版過濾器必須要放在app中,并且這個app必須要在INSTALLED_APPS中進(jìn)行安裝。然后再在這個app下面創(chuàng)建一個Python包叫做templatetags。再在這個包下面創(chuàng)建一個python文件。比如app的名字叫做book,那么項(xiàng)目結(jié)構(gòu)如下:
- book - views.py - urls.py - models.py - templatetags - my_filter.py
在創(chuàng)建了存儲過濾器的文件后,接下來就是在這個文件中寫過濾器了。過濾器實(shí)際上就是python中的一個函數(shù),只不過是把這個函數(shù)注冊到模板庫中,以后在模板中就可以使用這個函數(shù)了。但是這個函數(shù)的參數(shù)有限制,第一個參數(shù)必須是這個過濾器需要處理的值,第二個參數(shù)可有可無,如果有,那么就意味著在模板中可以傳遞參數(shù)。并且過濾器的函數(shù)最多只能有兩個參數(shù)。在寫完過濾器后,再使用django.template.Library對象注冊進(jìn)去。示例代碼如下:
from django import template # 創(chuàng)建模板庫對象 register = template.Library() # 過濾器函數(shù) def mycut(value,mystr): return value.replace(mystr) # 將函數(shù)注冊到模板庫中 register.filter("mycut",mycut)
以后想要在模板中使用這個過濾器,就要在模板中l(wèi)oad一下這個過濾器所在的模塊的名字(也就是這個python文件的名字)。示例代碼如下:
{% load my_filter %}
自定義時間計(jì)算過濾器:
有時候經(jīng)常會在朋友圈、微博中可以看到一條信息發(fā)表的時間,并不是具體的時間,而是距離現(xiàn)在多久。比如剛剛,1分鐘前等。這個功能DTL是沒有內(nèi)置這樣的過濾器的,因此我們可以自定義一個這樣的過濾器。示例代碼如下:
# time_filter.py文件 from datetime import datetime from django import template register = template.Library() def time_since(value): """ time距離現(xiàn)在的時間間隔 1\. 如果時間間隔小于1分鐘以內(nèi),那么就顯示“剛剛” 2\. 如果是大于1分鐘小于1小時,那么就顯示“xx分鐘前” 3\. 如果是大于1小時小于24小時,那么就顯示“xx小時前” 4\. 如果是大于24小時小于30天以內(nèi),那么就顯示“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)
在模版中使用的示例代碼如下:
{% load time_filter %} ... {% value|time_since %} ...
為了更加方便的將函數(shù)注冊到模版庫中當(dāng)作過濾器。也可以使用裝飾器來將一個函數(shù)包裝成過濾器。示例代碼如下:
from django import template register = template.Library() @register.filter(name='mycut') def mycut(value,mystr): return value.replace(mystr,"")
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決Pytorch半精度浮點(diǎn)型網(wǎng)絡(luò)訓(xùn)練的問題
這篇文章主要介紹了解決Pytorch半精度浮點(diǎn)型網(wǎng)絡(luò)訓(xùn)練的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python使用plt.boxplot()函數(shù)繪制箱圖、常用方法以及含義詳解
箱線圖一般用來展現(xiàn)數(shù)據(jù)的分布,如上下四分位值、中位數(shù)等,也可以直觀地展示異常點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Python使用plt.boxplot()函數(shù)繪制箱圖、常用方法以及含義詳解的相關(guān)資料,需要的朋友可以參考下2022-08-08基于Opencv制作的美顏相機(jī)帶你領(lǐng)略美顏特效的效果
最關(guān)于美顏類相機(jī)最重要的是第一步:人臉檢測,本篇文章中是采用openCV開源庫實(shí)現(xiàn),文中給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值2021-09-09解決Python報(bào)錯Valueerror: Expected 2d Array
如您所知,每種編程語言都會遇到很多錯誤,有些是在運(yùn)行時,有些是在編譯時,下面我就來看看當(dāng)發(fā)生錯誤 ValueError: Expected 2D array, got 1D array instead時該如何解決吧2024-01-01Python?中給請求設(shè)置用戶代理?User-Agent的方法
本文介紹?HTTP?標(biāo)頭用戶代理主題以及如何使用?Python?中的請求設(shè)置用戶代理,您將了解?HTTP?標(biāo)頭及其在理解用戶代理、獲取用戶代理以及學(xué)習(xí)使用?Python?中的請求設(shè)置用戶代理的多種方法方面的重要性,感興趣的朋友跟隨小編一起看看吧2023-06-06Python利用request庫實(shí)現(xiàn)翻譯接口
這篇文章主要為大家詳細(xì)介紹了Python如何利用request庫打造自己的翻譯接口,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04Python實(shí)現(xiàn)圖像壓縮和圖像處理詳解
隨著現(xiàn)在短視頻類越來越火,隨之而來的就是大量的視頻圖像的處理。這篇文章主要為大家介紹了Python如何一鍵實(shí)現(xiàn)圖像壓縮和圖像處理,希望對你們有所幫助2022-07-07Python嵌套列表轉(zhuǎn)一維的方法(壓平嵌套列表)
今天小編就為大家分享一篇Python嵌套列表轉(zhuǎn)一維的方法(壓平嵌套列表),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07