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实现ping的方法
Jul 06 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
浅析Python四种数据类型
Sep 26 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
python Django中models进行模糊查询的示例
Jul 18 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
php图像验证码生成代码
2017/06/08 PHP
PHP查询分页的实现代码
2017/06/09 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
JavaScript 学习笔记(四)
2009/12/31 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
Python字符串替换实例分析
2015/05/11 Python
python中__slots__用法实例
2015/06/04 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
python实现按关键字筛选日志文件
2019/12/24 Python
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
实习教师个人的自我评价
2013/11/08 职场文书
幼儿师范毕业生自荐信
2013/11/09 职场文书
物业管理专业个人的自我评价
2013/11/19 职场文书
大学在校生求职信范文
2013/11/21 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书