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的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 Python
深入浅析python继承问题
May 29 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
Python Socket编程详细介绍
Mar 23 Python
python决策树之CART分类回归树详解
Dec 20 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
python挖矿算力测试程序详解
Jul 03 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
python用tkinter开发的扫雷游戏
Jun 01 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无刷新上传文件实现代码
2011/09/19 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
php解析json数据实例
2014/08/19 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
Python的randrange()方法使用教程
2015/05/15 Python
Python中的hypot()方法使用简介
2015/05/18 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
python分割列表(list)的方法示例
2017/05/07 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
python实现ping命令小程序
2020/12/28 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
新法人代表任命书
2014/06/06 职场文书
反腐倡廉标语
2014/06/24 职场文书
质量负责人岗位职责
2015/02/15 职场文书
小平您好观后感
2015/06/09 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫