一、django
中自带的过滤器参考
二、django
中自定义过滤器
- 1、在
app
下创建一个包templatetags
(名字必须是这个) - 2、这个
app
必须在settings.py
中注册 - 3、在
templatetags
中创建一个xx.py
文件 - 4、下面定义了2个过滤器
from django import template
import datetime
register = template.Library()
@register.filter
def chinese_date_format(value):
"""
一个将时间转换为中国时间的过滤器
:param value:
:return:
"""
if isinstance(value, datetime.datetime):
return "{}年{}月{}日".format(value.year, value.month, value.day)
else:
return value
@register.filter
def add_description(value, tag):
"""
一个给标签添加tag的过滤器
:param value:
:param tag:
:return:
"""
return f'{value}({tag})'
- 5、在需要使用自定义的过滤器的模板中(在
django
中指的是html
页面)
{% load [你自定义的过滤器的py文件名] %}
- 6、使用
...
<td>{{ book.name | add_description:"一本书" }}</td>
<td>{{ book.date | chinese_date_format }}</td>
...
三、附加一个常用的过滤器
定义一个多少时间之前的过滤器,使用方式和上面一样的
@register.filter('time_ago')
def time_ago(value):
"""
定义一个距离当前时间多久之前的过滤器
:param value:
:return:
1.如果时间间隔小于1分钟内,那么就显示刚刚
2.如果时间间隔大于1分钟小于1小时,那么就显示xx分钟前
3.如果时间间隔大于1小时小于24小时,那么就显示xx小时前
4.如果时间间隔大于24小时小于30天,那么就显示xx天前
5.如果时间间隔大于30天,那么就显示具体时间
"""
if not isinstance(value, datetime.datetime):
return value
now = datetime.datetime.now()
timestamp = (now - value).total_seconds()
if timestamp < 60:
return '刚刚'
elif timestamp >= 60 and timestamp < 60 * 60:
return '{}分钟前'.format(int(timestamp / 60))
elif timestamp >= 60 * 60 and timestamp < 60 * 60 * 24:
return '{}小时前'.format(timestamp / 60 / 60)
elif timestamp >= 60 * 60 * 24 and timestamp < 60 * 60 * 23 * 30:
return '{}天前'.format(int(timestamp / 60 / 60 / 24))
else:
return value.strftime('%Y-%m-%d %H:%M')