django过滤器(django 自定义过滤器的实现)
django过滤器
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对象注册进去。示例代码如下:
|
from django import template # 创建模板库对象 register = template.Library() # 过滤器函数 def mycut(value,mystr): return value.replace(mystr) # 将函数注册到模板库中 register. filter ( "mycut" ,mycut) |
以后想要在模板中使用这个过滤器,就要在模板中load一下这个过滤器所在的模块的名字(也就是这个python文件的名字)。示例代码如下:
|
{ % load my_filter % } |
自定义时间计算过滤器:
有时候经常会在朋友圈、微博中可以看到一条信息发表的时间,并不是具体的时间,而是距离现在多久。比如刚刚,1分钟前等。这个功能DTL是没有内置这样的过滤器的,因此我们可以自定义一个这样的过滤器。示例代码如下:
|
# 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) |
在模版中使用的示例代码如下:
|
{ % load time_filter % } ... { % value|time_since % } ... |
为了更加方便的将函数注册到模版库中当作过滤器。也可以使用装饰器来将一个函数包装成过滤器。示例代码如下:
|
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
- vue三种判断条件(Vue中插槽和过滤器的深入讲解)
- MVC过滤器的用法
- tomcat作用及原理(详解Tomcat常用的过滤器)
- vuejs过滤器使用教程(vue3删除过滤器的原因)
- vue过滤器使用思路(vue 过滤器和自定义指令的使用)
- mysql拼接和过滤(mysql 如何动态修改复制过滤器)
- django过滤器(django 自定义过滤器的实现)
- nginx过滤器漏洞(Nginx反爬虫策略,防止UA抓取网站)
- vue过滤器filters怎么用(如何使用vue过滤器filter)
- angularjs过滤器
- vuejs filter过滤器的使用(Vue过滤器filter实现及应用场景详解)
- 门外之见 海蛎子味 的表演,能走多远(门外之见海蛎子味)
- 三部冷门谍战剧,第一部2014年拍摄,至今还未播出(三部冷门谍战剧)
- 《金陵秘事》的剧情跌宕起伏 给观众带来的怎样的感官体验(金陵秘事的剧情跌宕起伏)
- 少儿口才表达影响未来一生,50首经典绕口令和孩子玩出聪明大脑(少儿口才表达影响未来一生)
- 玩网游居然让人更友善 很难以让人置信(玩网游居然让人更友善)
- 学好汉语拼音,从娃娃绕口令抓起,平时还是要多练 收藏好(从娃娃绕口令抓起)
热门推荐
- 搭建web服务器与设置(怎样在Win7系统中搭建Web服务器)
- python人脸识别库(20行python代码实现人脸识别)
- 微信小程序scrollview 截图(微信小程序scroll-view不能左右滑动问题的解决方法)
- 阿里云ecs服务器挂了怎么办(阿里云ECS云服务器如何开放8080端口)
- 微信小程序引用模板的函数(微信小程序页面与组件之间信息传递与函数调用)
- 云服务选什么系统(云服务器用什么系统好)
- SQL Server Check 约束
- easyui datebox的用法
- mysql读写分离同步策略(Mysql主从复制与读写分离图文详解)
- dedecms搬家乱码(dedecms 的cn_substr_utf8字符串截取函数商榷)