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正则表达式中的括号匹配问题
Dec 14 Python
Python 专题一 函数的基础知识
Mar 16 Python
Python机器学习logistic回归代码解析
Jan 17 Python
对python中的xlsxwriter库简单分析
May 04 Python
python画一个玫瑰和一个爱心
Aug 18 Python
Python实现Dijkstra算法
Oct 17 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 Python
mac使用python识别图形验证码功能
Jan 10 Python
Django实现后台上传并显示图片功能
May 29 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
python切片作为占位符使用实例讲解
Feb 17 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
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
Python实现的爬虫功能代码
2017/06/24 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python中列表的含义及用法
2020/05/26 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
后勤副校长自我鉴定
2013/10/13 职场文书
汽车运用工程毕业生自荐信
2013/10/29 职场文书
信访工作者先进事迹
2014/01/17 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
村创先争优活动总结
2014/08/28 职场文书
销售人才自我评价范文
2014/09/27 职场文书
污水处理保证书
2015/05/09 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书