django 自定义过滤器的实现


Posted in Python onFebruary 26, 2019

自定义模版过滤器

虽然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,"")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python FTP操作类代码分享
May 13 Python
Python实现提取文章摘要的方法
Apr 21 Python
Python socket编程实例详解
May 27 Python
Python3中的2to3转换工具使用示例
Jun 12 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
linux下python中文乱码解决方案详解
Aug 28 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
使用python创建生成动态链接库dll的方法
May 09 Python
Python request中文乱码问题解决方案
Sep 17 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 #Python
Python-ElasticSearch搜索查询的讲解
Feb 25 #Python
Python2 Selenium元素定位的实现(8种)
Feb 25 #Python
selenium python 实现基本自动化测试的示例代码
Feb 25 #Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 #Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 #Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 #Python
You might like
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
pytorch标签转onehot形式实例
2020/01/02 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
高三体育教学反思
2014/01/29 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers