前言
虽然
DTL
给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此
Django
给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求。
自定义过滤器
-
首先在某个
app
中,创建一个
python
包,叫做
templatetags
,注意,这个包的名字必须为
templatetags
,不然就找不到。
-
在这个
templatetags
包下面,创建一个
python
文件用来存储过滤器。
-
在新建的
python
文件中,定义过滤器(也就是函数),这个函数的第一个参数永远是被过滤的那个值,并且如果在使用过滤器的时候传递参数,那么还可以定义另外一个参数。但是过滤器最多只能有2个参数。
-
在写完过滤器(函数)后,要使用
django.template.Library.filter
进行注册。
-
还要把这个过滤器所在的这个
app
添加到
settings.INSTALLED_APS
中,不然Django也找不到这个过滤器。
-
在模板中使用
load
标签加载过滤器所在的python包。
-
可以使用过滤器了。
-
django.template.Library.filter
还可以当作装饰器来使用。如果
filter
函数没有传递任何参数,那么将会使用这个函数的名字来作为过滤器的名字。当然如果你不想使用函数的名字来作为过滤器的名字,也可以传递一个name参数。示例代码如下:
@register.filter(\'my_greet\')def greet(value,word):return value + word
时间过滤器案例
有时候经常会在朋友圈、微博中可以看到一条信息发表的时间,并不是具体的时间,而是距离现在多久。比如刚刚,1分钟前等。这个功能DTL是没有内置这样的过滤器的,因此我们可以自定义一个这样的过滤器。示例代码如下:
# [email protected](name="time_since") # 将函数注册到模版库中当作过滤器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 f"{minutes}分钟前"elif timestamp >= 60 * 60 and timestamp < 60 * 60 *24:hours = int(timestamp / (60 * 60))return f"{hours}小时前"elif timestamp >= 60 * 60 * 24 and timestamp < 60 * 60 * 24 * 30:days = int(timestamp / (60 * 60 * 24))return f"{days}天前"else:return value.strftime("%Y/%m/%d %H:%M")else:return value
在模版中使用的示例代码如下:
{% load time_filter %} <!--加载自定义过滤器,time_filter是创建的python文件的名字-->...{% value|time_since %} <!--使用自定义过滤器-->...