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使用正则表达式检测密码强度源码分享
Jun 11 Python
python根据日期返回星期几的方法
Jul 06 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
Python文件和流(实例讲解)
Sep 12 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
Python实现注册、登录小程序功能
Sep 21 Python
Python使用pydub库对mp3与wav格式进行互转的方法
Jan 10 Python
PyQt5图形界面播放音乐的实例
Jun 17 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 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数组循环操作详细介绍 附实例代码
2013/02/03 PHP
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
python中正则表达式的使用详解
2014/10/17 Python
Python中元组,列表,字典的区别
2017/05/21 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python实现快速计算词频功能示例
2018/06/25 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
python安装本地whl的实例步骤
2019/10/12 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
python中类与对象之间的关系详解
2020/12/16 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
比较基础的php面试题及答案-填空题
2014/04/26 面试题
婚庆公司计划书
2014/09/15 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
催款函范文
2015/06/24 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
Python OpenGL基本配置方式
2022/05/20 Python