django 自定义过滤器的实现
自定义模版过滤器
虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求。
模版过滤器必须要放在app中,并且这个app必须要在INSTALLED_APPS中进行安装。然后再在这个app下面创建一个Python包叫做templatetags。再在这个包下面创建一个python文件。比如app的名字叫做book,那么项目结构如下:
-book -views.py -urls.py -models.py -templatetags -my_filter.py
在创建了存储过滤器的文件后,接下来就是在这个文件中写过滤器了。过滤器实际上就是python中的一个函数,只不过是把这个函数注册到模板库中,以后在模板中就可以使用这个函数了。但是这个函数的参数有限制,第一个参数必须是这个过滤器需要处理的值,第二个参数可有可无,如果有,那么就意味着在模板中可以传递参数。并且过滤器的函数最多只能有两个参数。在写完过滤器后,再使用django.template.Library对象注册进去。示例代码如下:
fromdjangoimporttemplate
#创建模板库对象
register=template.Library()
#过滤器函数
defmycut(value,mystr):
returnvalue.replace(mystr)
#将函数注册到模板库中
register.filter("mycut",mycut)
以后想要在模板中使用这个过滤器,就要在模板中load一下这个过滤器所在的模块的名字(也就是这个python文件的名字)。示例代码如下:
{%loadmy_filter%}
自定义时间计算过滤器:
有时候经常会在朋友圈、微博中可以看到一条信息发表的时间,并不是具体的时间,而是距离现在多久。比如刚刚,1分钟前等。这个功能DTL是没有内置这样的过滤器的,因此我们可以自定义一个这样的过滤器。示例代码如下:
#time_filter.py文件
fromdatetimeimportdatetime
fromdjangoimporttemplate
register=template.Library()
deftime_since(value):
"""
time距离现在的时间间隔
1\.如果时间间隔小于1分钟以内,那么就显示“刚刚”
2\.如果是大于1分钟小于1小时,那么就显示“xx分钟前”
3\.如果是大于1小时小于24小时,那么就显示“xx小时前”
4\.如果是大于24小时小于30天以内,那么就显示“xx天前”
5\.否则就是显示具体的时间2017/10/2016:15
"""
ifisinstance(value,datetime):
now=datetime.now()
timestamp=(now-value).total_seconds()
iftimestamp<60:
return"刚刚"
eliftimestamp>=60andtimestamp<60*60:
minutes=int(timestamp/60)
return"%s分钟前"%minutes
eliftimestamp>=60*60andtimestamp<60*60*24:
hours=int(timestamp/(60*60))
return"%s小时前"%hours
eliftimestamp>=60*60*24andtimestamp<60*60*24*30:
days=int(timestamp/(60*60*24))
return"%s天前"%days
else:
returnvalue.strftime("%Y/%m/%d%H:%M")
else:
returnvalue
register.filter("time_since",time_since)
在模版中使用的示例代码如下:
{%loadtime_filter%}
...
{%value|time_since%}
...
为了更加方便的将函数注册到模版库中当作过滤器。也可以使用装饰器来将一个函数包装成过滤器。示例代码如下:
fromdjangoimporttemplate register=template.Library() @register.filter(name='mycut') defmycut(value,mystr): returnvalue.replace(mystr,"")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。