美文网首页
最浅显易懂的Django系列教程(11)-自定义过滤器

最浅显易懂的Django系列教程(11)-自定义过滤器

作者: 编程小蝉 | 来源:发表于2020-05-14 11:02 被阅读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,"")
    

    看文章不过瘾?还有免费的视频教程,让你学起来更轻松:https://www.zhiliaoketang.cn/course/detail/4.html

    相关文章

      网友评论

          本文标题:最浅显易懂的Django系列教程(11)-自定义过滤器

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