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 探针的实现原理
Apr 23 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python自动发送邮件脚本
Jun 20 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
Python jieba库用法及实例解析
Nov 04 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
解决pytorch 模型复制的一些问题
Mar 03 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
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
python网络编程实例简析
2014/09/26 Python
python实现红包裂变算法
2016/02/16 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
python+django+rest框架配置创建方法
2019/08/31 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
Python jieba库分词模式实例用法
2021/01/13 Python
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
新闻编辑自荐书范文
2014/02/12 职场文书
竞聘书模板
2014/03/31 职场文书
县级文明单位申报材料
2014/05/23 职场文书
温馨提示标语
2014/06/26 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
检讨书怎么写
2015/01/23 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
2015年计划生育责任书
2015/05/08 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
关于Python中*args和**kwargs的深入理解
2021/08/07 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技