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使用三角迭代计算圆周率PI的方法
Mar 20 Python
selenium+python实现自动登录脚本
Apr 22 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
使用python实现mqtt的发布和订阅
May 05 Python
Python with用法:自动关闭文件进程
Jul 10 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
Python Flask异步发送邮件实现方法解析
Aug 01 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
Python实现Hash算法
Mar 18 Python
Python如何加载模型并查看网络
Jul 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
php简单实现MVC
2015/02/05 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
学习ExtJS table布局
2009/10/08 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
js模块加载方式浅析
2017/08/12 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
饮料业务员岗位职责
2013/12/15 职场文书
骨干教师培训制度
2014/01/13 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python