当前位置:脚本大全 > > 正文

django过滤器(django 自定义过滤器的实现)

时间:2022-01-20 00:08:43类别:脚本大全

django过滤器

django 自定义过滤器的实现

自定义模版过滤器

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

模版过滤器必须要放在app中,并且这个app必须要在INSTALLED_APPS中进行安装。然后再在这个app下面创建一个Python包叫做templatetags。再在这个包下面创建一个python文件。比如app的名字叫做book,那么项目结构如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • - book
  •   - views.py
  •   - urls.py
  •   - models.py
  •   - templatetags
  •     - my_filter.py
  • 在创建了存储过滤器的文件后,接下来就是在这个文件中写过滤器了。过滤器实际上就是python中的一个函数,只不过是把这个函数注册到模板库中,以后在模板中就可以使用这个函数了。但是这个函数的参数有限制,第一个参数必须是这个过滤器需要处理的值,第二个参数可有可无,如果有,那么就意味着在模板中可以传递参数。并且过滤器的函数最多只能有两个参数。在写完过滤器后,再使用django.template.Library对象注册进去。示例代码如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • from django import template
  •  
  • # 创建模板库对象
  • register = template.Library()
  •  
  • # 过滤器函数
  • def mycut(value,mystr):
  •   return value.replace(mystr)
  • # 将函数注册到模板库中
  • register.filter("mycut",mycut)
  • 以后想要在模板中使用这个过滤器,就要在模板中load一下这个过滤器所在的模块的名字(也就是这个python文件的名字)。示例代码如下:

  • ?
  • 1
  • {% load my_filter %}
  • 自定义时间计算过滤器:

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • # 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)
  • 在模版中使用的示例代码如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • {% load time_filter %}
  • ...
  • {% value|time_since %}
  • ...
  • 为了更加方便的将函数注册到模版库中当作过滤器。也可以使用装饰器来将一个函数包装成过滤器。示例代码如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • from django import template
  • register = template.Library()
  •  
  • @register.filter(name='mycut')
  • def mycut(value,mystr):
  •   return value.replace(mystr,"")
  • 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。

    原文链接:https://www.jianshu.com/p/4ceeee528430

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐