一、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')
复制代码