• Django(32)自定义过滤器


    前言

    虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求。
     

    自定义过滤器

    1. 首先在某个app中,创建一个python包,叫做templatetags,注意,这个包的名字必须为templatetags,不然就找不到。

    2. 在这个templatetags包下面,创建一个python文件用来存储过滤器。

    3. 在新建的python文件中,定义过滤器(也就是函数),这个函数的第一个参数永远是被过滤的那个值,并且如果在使用过滤器的时候传递参数,那么还可以定义另外一个参数。但是过滤器最多只能有2个参数。

    4. 在写完过滤器(函数)后,要使用django.template.Library.filter进行注册。

    5. 还要把这个过滤器所在的这个app添加到settings.INSTALLED_APS中,不然Django也找不到这个过滤器。

    6. 在模板中使用load标签加载过滤器所在的python包。

    7. 可以使用过滤器了。

    8. django.template.Library.filter还可以当作装饰器来使用。如果filter函数没有传递任何参数,那么将会使用这个函数的名字来作为过滤器的名字。当然如果你不想使用函数的名字来作为过滤器的名字,也可以传递一个name参数。示例代码如下:

    @register.filter('my_greet')
    def greet(value,word):
        return value + word
    

    时间过滤器案例

    有时候经常会在朋友圈、微博中可以看到一条信息发表的时间,并不是具体的时间,而是距离现在多久。比如刚刚,1分钟前等。这个功能DTL是没有内置这样的过滤器的,因此我们可以自定义一个这样的过滤器。示例代码如下:

    # time_filter.py
    @register.filter(name="time_since")  # 将函数注册到模版库中当作过滤器
    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 f"{minutes}分钟前"
            elif timestamp >= 60 * 60 and timestamp < 60 * 60 *24:
                hours = int(timestamp / (60 * 60))
                return f"{hours}小时前"
            elif timestamp >= 60 * 60 * 24 and timestamp < 60 * 60 * 24 * 30:
                days = int(timestamp / (60 * 60 * 24))
                return f"{days}天前"
            else:
                return value.strftime("%Y/%m/%d %H:%M")
        else:
            return value
    

    在模版中使用的示例代码如下:

    {% load time_filter %}  <!--加载自定义过滤器,time_filter是创建的python文件的名字-->
    ...
    {% value|time_since %}  <!--使用自定义过滤器-->
    ...
    
  • 相关阅读:
    Office Web Apps安装部署(一)
    TFS 2012使用简介
    SharePoint 2013 内容部署功能简介
    SharePoint 自定义WebPart之间的连接
    循环滚动新闻列表-懒人图库
    SharePoint 2010 文档管理之过期归档工具
    SharePoint 2010 文档管理系列之文档搜索
    SharePoint 网站登录不上,3次输入用户名/密码白页、
    SharePoint 门户添加内网域名
    JavaScript异常处理和事件处理
  • 原文地址:https://www.cnblogs.com/jiakecong/p/14803809.html
Copyright © 2020-2023  润新知