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中__slots__用法实例
Jun 04 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
django2.0扩展用户字段示例
Feb 13 Python
pybind11和numpy进行交互的方法
Jul 04 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
python多线程分块读取文件
Aug 29 Python
python支持多线程的爬虫实例
Dec 21 Python
使用遗传算法求二元函数的最小值
Feb 11 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
php实现微信模板消息推送
2018/03/30 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
Python探索之ModelForm代码详解
2017/10/26 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python3远程监控程序的实现方法
2019/07/15 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
毕业自荐信
2013/12/16 职场文书
经营管理策划方案
2014/05/22 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
主持人大赛开场白
2015/05/29 职场文书
董事长秘书工作总结
2015/08/14 职场文书
初中化学教学反思
2016/02/22 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL