Django(32)自定义过滤器[通俗易懂]

Django(32)自定义过滤器[通俗易懂]前言虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求。自定义过滤器首先在某个app中,创建

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

虽然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 %}  <!--使用自定义过滤器-->
...
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164909.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 服务端稳定性测试_web端性能测试怎么做

    服务端稳定性测试_web端性能测试怎么做1概述1.1背景系统的稳定性是系统长期稳定运行能力,需要时间累积才能度量。平台的某些问题需要达到一定时间、一定的使用量后才会暴露出来。如内存泄漏,系统运行过程中发现部分服务的部分接口会发生服务不可达的情况。从而团队提出对平台进行稳定性分析,通过给系统施加一定业务压力大情况下,使系统持续运行一段时间,以此来检测系统是否稳定运行(下统称稳定性测试或测试)。1.2服务说明平台运行的服务包括系统服务和业务服务,系统服务包括Consul、Redis、Cap、RabbitMQ、Exceptionless

    2022年9月5日
  • windows下检出项目和提交项目

    windows下检出项目和提交项目

    2021年10月17日
  • 浅复制,深复制详解下载_复制时如何跳过一部分内容

    浅复制,深复制详解下载_复制时如何跳过一部分内容文章目录浅复制和深复制String类实现浅复制和深复制有关浅复制与深复制的定义为:对类进行复制的时候按位复制,即把一个对象各数据成员的值原样复制到目标对象中。当类中涉及到指针类型数据成员的时候,往往就会产生指针悬挂问题。看以下结构:class A{ public: int* a;};A a1;A b1=a1;b1=a1执行的是浅复制,此时a1.a和b1….

    2022年8月18日
  • python移动应用开发_python做手机app

    python移动应用开发_python做手机app广告关闭腾讯云11.11云上盛惠,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!解压后依次执行以下命令安装sdk。$cdtencentcloud-sdk-python$pythonsetup.pyinstall示例代码说明:所有示例代码仅作参考,无法直接编译和运行…13711112222为手机号,最多不要超过200个手机号req.pho…

    2022年8月12日
  • 金蝶java开发(金蝶中间件 开源)

    面试的是java开发岗1.首先是做一份笔试题,笔试题比较简单,主要是设计模式,sql查询,linux命令2.面试分3轮第一轮:1个面试官,总体答得还行比较全面的技术面试,包括了(1)jvm内存模型:堆栈,方法区,程序计数器,本地方法区,以及他们各种的作用(2)jvm垃圾回收算法:复制算法,标记-清除,标记-整理,以及他们使用的场景和大致的作用1)多线程:synchron…

    2022年4月15日
  • vue父组件调用子组件方法返回值_vue子组件修改父组件值

    vue父组件调用子组件方法返回值_vue子组件修改父组件值子组件调用父组件方法,父组件执行完后,进行回调,代码如下:子组件this.$emit(‘change’,this.dataList,(loading)=>{this.loading=loading})父组件@change=”onChange”………………………………..

    2022年10月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号