django 自定義過(guò)濾器的實(shí)現(xiàn)
自定義模版過(guò)濾器
雖然DTL給我們內(nèi)置了許多好用的過(guò)濾器。但是有些時(shí)候還是不能滿足我們的需求。因此Django給我們提供了一個(gè)接口,可以讓我們自定義過(guò)濾器,實(shí)現(xiàn)自己的需求。
模版過(guò)濾器必須要放在app中,并且這個(gè)app必須要在INSTALLED_APPS中進(jìn)行安裝。然后再在這個(gè)app下面創(chuàng)建一個(gè)Python包叫做templatetags。再在這個(gè)包下面創(chuàng)建一個(gè)python文件。比如app的名字叫做book,那么項(xiàng)目結(jié)構(gòu)如下:
- book
- views.py
- urls.py
- models.py
- templatetags
- my_filter.py
在創(chuàng)建了存儲(chǔ)過(guò)濾器的文件后,接下來(lái)就是在這個(gè)文件中寫(xiě)過(guò)濾器了。過(guò)濾器實(shí)際上就是python中的一個(gè)函數(shù),只不過(guò)是把這個(gè)函數(shù)注冊(cè)到模板庫(kù)中,以后在模板中就可以使用這個(gè)函數(shù)了。但是這個(gè)函數(shù)的參數(shù)有限制,第一個(gè)參數(shù)必須是這個(gè)過(guò)濾器需要處理的值,第二個(gè)參數(shù)可有可無(wú),如果有,那么就意味著在模板中可以傳遞參數(shù)。并且過(guò)濾器的函數(shù)最多只能有兩個(gè)參數(shù)。在寫(xiě)完過(guò)濾器后,再使用django.template.Library對(duì)象注冊(cè)進(jìn)去。示例代碼如下:
from django import template
# 創(chuàng)建模板庫(kù)對(duì)象
register = template.Library()
# 過(guò)濾器函數(shù)
def mycut(value,mystr):
return value.replace(mystr)
# 將函數(shù)注冊(cè)到模板庫(kù)中
register.filter("mycut",mycut)
以后想要在模板中使用這個(gè)過(guò)濾器,就要在模板中l(wèi)oad一下這個(gè)過(guò)濾器所在的模塊的名字(也就是這個(gè)python文件的名字)。示例代碼如下:
{% load my_filter %}
自定義時(shí)間計(jì)算過(guò)濾器:
有時(shí)候經(jīng)常會(huì)在朋友圈、微博中可以看到一條信息發(fā)表的時(shí)間,并不是具體的時(shí)間,而是距離現(xiàn)在多久。比如剛剛,1分鐘前等。這個(gè)功能DTL是沒(méi)有內(nèi)置這樣的過(guò)濾器的,因此我們可以自定義一個(gè)這樣的過(guò)濾器。示例代碼如下:
# time_filter.py文件
from datetime import datetime
from django import template
register = template.Library()
def time_since(value):
"""
time距離現(xiàn)在的時(shí)間間隔
1\. 如果時(shí)間間隔小于1分鐘以內(nèi),那么就顯示“剛剛”
2\. 如果是大于1分鐘小于1小時(shí),那么就顯示“xx分鐘前”
3\. 如果是大于1小時(shí)小于24小時(shí),那么就顯示“xx小時(shí)前”
4\. 如果是大于24小時(shí)小于30天以內(nèi),那么就顯示“xx天前”
5\. 否則就是顯示具體的時(shí)間 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小時(shí)前" % 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ù)注冊(cè)到模版庫(kù)中當(dāng)作過(guò)濾器。也可以使用裝飾器來(lái)將一個(gè)函數(shù)包裝成過(guò)濾器。示例代碼如下:
from django import template register = template.Library() @register.filter(name='mycut') def mycut(value,mystr): return value.replace(mystr,"")
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
這篇文章主要介紹了django框架事務(wù)處理,結(jié)合實(shí)例形式總結(jié)分析了使用ORM 事務(wù)及raw sql,customize sql 事務(wù)處理相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-06-06
python3 使用函數(shù)求兩個(gè)數(shù)的和與差
這篇文章主要介紹了python3 使用函數(shù)求兩個(gè)數(shù)的和與差,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-05-05
解決python中顯示圖片的plt.imshow plt.show()內(nèi)存泄漏問(wèn)題
這篇文章主要介紹了解決python中顯示圖片的plt.imshow plt.show()內(nèi)存泄漏問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python辦公自動(dòng)化之JSOM數(shù)據(jù)處理與SQL Server數(shù)據(jù)庫(kù)操作
這篇文章主要為大家詳細(xì)介紹了Python辦公自動(dòng)化中JSOM數(shù)據(jù)處理與SQL Server數(shù)據(jù)庫(kù)操作的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考下2024-01-01

