django 自定义过滤器的实现

yipeiwu_com6年前Python基础

自定义模版过滤器

虽然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 2.6.6升级到python 2.7.x版本的方法

1.下载python2.7.x wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz 2.解压并编译安装 tar -...

python科学计算之scipy——optimize用法

写在前面 SciPy的optimize模块提供了许多数值优化算法,下面对其中的一些记录。 非线性方程组求解 SciPy中对非线性方程组求解是fslove()函数,它的调用形式一般为fsl...

python中如何使用分步式进程计算详解

python中如何使用分步式进程计算详解

前言 在python中使用多进程和多线程都能达到同时运行多个任务,和多进程和多线程的选择上,应该优先选择多进程的方式,因为多进程更加稳定,且对于进程的操作管理也更加方便,但有一点是多进程...

深入理解Python中命名空间的查找规则LEGB

名字空间 Python 的名字空间是 Python 一个非常核心的内容。 其他语言中如 C 中,变量名是内存地址的别名,而在 Python 中,名字是一个字符串对象,它与他指向的对象构成...

Python在信息学竞赛中的运用及Python的基本用法(详解)

Python在信息学竞赛中的运用及Python的基本用法(详解)

前言 众所周知,Python是一种非常实用的语言。但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序。但正如LRJ在《算法竞赛入门经典-训练指南》中所说的一样,如果会...