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数据结构树和二叉树简介
Apr 29 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
基于python绘制科赫雪花
Jun 22 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
python批量赋值操作实例
Oct 22 Python
windows下numpy下载与安装图文教程
Apr 02 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
Django自关联实现多级联动查询实例
May 19 Python
python利用 keyboard 库记录键盘事件
Oct 16 Python
七个非常实用的Python工具包总结
Jun 15 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
IE的fireEvent方法概述及应用
2013/02/22 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
Python中属性和描述符的正确使用
2016/08/23 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python elasticsearch环境搭建详解
2019/09/02 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
北京振戎融通Java面试题
2015/09/03 面试题
机械设计及其自动化求职推荐信
2014/02/17 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
公司借款担保书
2015/09/22 职场文书
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS