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中__init__()方法的高级应用
May 11 Python
在Python中处理时间之clock()方法的使用
May 22 Python
Python操作MongoDB详解及实例
May 18 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
python如何为创建大量实例节省内存
Mar 20 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
Python实现信息管理系统
Jun 05 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
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
python如何停止递归
2020/09/09 Python
python中操作文件的模块的方法总结
2021/02/04 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
财务会计专业毕业生自荐信
2013/10/19 职场文书
大一军训感言
2014/01/09 职场文书
20年同学聚会感言
2014/02/03 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
2014年生产部工作总结
2014/12/17 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
就业证明函
2015/06/17 职场文书
师德培训心得体会2016
2016/01/09 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
Pytorch 实现变量类型转换
2021/05/17 Python
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Python中的pprint模块
2021/11/27 Python
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android