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 异常处理的实例详解
Sep 11 Python
详解python:time模块用法
Mar 25 Python
pyQt5实时刷新界面的示例
Jun 25 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
Python魔术方法专题
Jun 19 Python
通过自学python能找到工作吗
Jun 21 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
python 实现围棋游戏(纯tkinter gui)
Nov 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中Session的概念
2006/10/09 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
ie与ff下的event事件使用介绍
2013/11/25 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
python妙用之编码的转换详解
2017/04/21 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python3几个常见问题的处理方法
2019/02/26 Python
Python3中列表list合并的四种方法
2019/04/19 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
英国女性时尚品牌:Apricot
2018/12/04 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
会计辞职信范文
2014/01/15 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
综合测评个人总结
2015/03/03 职场文书
新郎新娘致辞
2015/07/31 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle