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 相关文章推荐
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
python pycurl验证basic和digest认证的方法
May 02 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
Python3列表List入门知识附实例
Feb 09 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
python实现与redis交互操作详解
Apr 21 Python
python statsmodel的使用
Dec 21 Python
Python扫描端口的实现
Jan 25 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
一端时间轮换的广告
2006/06/26 Javascript
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
如何快速上手Vuex
2017/02/14 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
python写入中英文字符串到文件的方法
2015/05/06 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
用python制作游戏外挂
2018/01/04 Python
Python实现的读写json文件功能示例
2018/06/05 Python
python中的decorator的作用详解
2018/07/26 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
初中优秀班集体申报材料
2014/05/01 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
毕业实习单位意见
2015/06/04 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript