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生成随机密码
Mar 10 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python切片知识解析
Mar 06 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
Python带动态参数功能的sqlite工具类
May 26 Python
Python字符串的全排列算法实例详解
Jan 07 Python
Python一行代码实现快速排序的方法
Apr 30 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
Python装饰器用法与知识点小结
Mar 09 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 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
php 三维饼图的实现代码
2008/09/28 PHP
PHP的加密方式及原理
2012/06/14 PHP
php开发文档 会员收费1期
2012/08/14 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
python3如何将docx转换成pdf文件
2018/03/23 Python
Django如何配置mysql数据库
2018/05/04 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
学习Django知识点分享
2019/09/11 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
做一个有道德的人活动实施方案
2014/08/23 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
python中的plt.cm.Paired用法说明
2021/05/31 Python
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
解析redis hash应用场景和常用命令
2021/08/04 Redis
python基础之文件操作
2021/10/24 Python
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫