美文网首页
3.4 django 自定义模板过滤器

3.4 django 自定义模板过滤器

作者: yungege | 来源:发表于2019-08-16 13:24 被阅读0次

自定义模板过滤器

虽然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,"")

相关文章

  • 3.4 django 自定义模板过滤器

    自定义模板过滤器 虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我...

  • Django_补充小技巧

    1.Templates过滤器 什么是过滤器? 写在模板中,属于Django模板语言 可以修改模板中的变量,...

  • django过滤器

    过滤器写在模板中,属于django模板语言。这样使用: value是变量,filter是过滤器。举例: 返回lis...

  • Django中自定义模板过滤器

    Django中的模板过滤器强大又好用。当然如果你的项目是前后端分离,未用到模板,那也就不存在模板过滤器一说。 模板...

  • Django框架(五):自定义过滤器及标签

    前言 为什么要自定义过滤器和标签:当Django自带的过滤器及标签不能满足我们需求的时候,我们就需要自定义过滤器和...

  • Flask过滤器

    Flask过滤器分为两种,模板过滤器和自定义过滤器 顾名思义,模板过滤器是人家已经定义好的,你直接拿来使用就好了 ...

  • Django - 自定义模板过滤器

    接着 内置模板过滤器 往下讲 一、模板过滤器的定义 在应用的目录下,如 front 下, 新建一个名为: temp...

  • Flask的jinja2模板中自定义过滤器的使用

    Flask的jinja2模板中自定义过滤器的使用 ...

  • Django - 模板结构优化

    接着 自定义模板过滤器 往下讲 一、引入模板 include 标签的使用 新建 templates/header....

  • 2020-06-02--flask04--flask基础04

    jinja2模板 表单验证 WTF表单验证 jinjia2语法 过滤器 jinja2的过滤器与django中的过滤...

网友评论

      本文标题:3.4 django 自定义模板过滤器

      本文链接:https://www.haomeiwen.com/subject/rhbfsctx.html