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 相关文章推荐
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
Django 缓存配置Redis使用详解
Jul 23 Python
Django 静态文件配置过程详解
Jul 23 Python
python中使用while循环的实例
Aug 05 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
python的slice notation的特殊用法详解
Dec 27 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
python语言的优势是什么
Jun 17 Python
教你怎么用python selenium实现自动化测试
May 27 Python
Python Matplotlib绘制动画的代码详解
May 30 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
input file获得文件根目录简单实现
2013/04/26 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
python实现QQ批量登录功能
2019/06/19 Python
python中常见错误及解决方法
2020/06/21 Python
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
医院后勤自我鉴定
2013/10/13 职场文书
高二美术教学反思
2014/01/14 职场文书
企业新年寄语
2014/04/04 职场文书
国庆宣传标语
2014/06/30 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
Python爬取某拍短视频
2021/06/11 Python
详解MySQL的内连接和外连接
2023/05/08 MySQL