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 25 Python
Python中给List添加元素的4种方法分享
Nov 28 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
Python Requests库基本用法示例
Aug 20 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
Django框架 信号调度原理解析
Sep 04 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
python 操作hive pyhs2方式
Dec 21 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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 开发环境配置(Zend Server安装)
2010/04/28 PHP
php引用传值实例详解学习
2013/11/06 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
brook javascript框架介绍
2011/10/10 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
python的Tqdm模块的使用
2018/01/10 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
python实现猜拳游戏项目
2020/11/30 Python
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
值传递还是引用传递
2015/02/08 面试题
怎么写好自荐书
2014/03/02 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
处级干部考察材料
2014/12/24 职场文书
联谊会开场白
2015/06/01 职场文书
田径运动会通讯稿
2015/07/18 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL