时间过滤器的设计(实现输出几分钟前,几小时前,几天前)

功能如下

如下图的右下角3分钟前。如果是1分钟内设定为刚刚,等等。

过滤器

在templatetags里面新建一个date_filter的时间转化功能。

大概的功能就是在template里面添加一个过滤器,并且加在传过来的参数旁边。

 

 

 

 注意一定要加_init_

 

 

 不然在模板里面是不能加载进去。

过滤器的后端设计

直接模板显示的数据

在templatetags里面设计一个date_filter然后load在对应的html页面上面,然后使用。

from django import template
from datetime import datetime
import pytz

# 注册过滤器
register = template.Library()

# data 是从数据库那边传过来的
@register.filter()
def date_filter(data):
    # 判断data是否datetime的实例
    if isinstance(data, datetime):
        # 获取最新时间
        now = datetime.now()
        now = now.replace(tzinfo=pytz.timezone('UTC'))
        # 确定settings里面的设置
        print('最新时间{}'.format(now))   # 大陆时间
        print('数据库的时间{}'.format(data))
        timestamp = (now-data).total_seconds()
        if timestamp < 60:
            return '刚刚'
        elif timestamp>=60 and timestamp<60 *60:
            minu = int(timestamp//60)
            return '{}分钟前'.format(minu)
        elif timestamp >=60*60 and timestamp <60*60*24:
            hour = int(timestamp//(60*60))
            return '{}小时前'.format(hour)
        elif timestamp >=60*60*24 and timestamp <60*60*24*30:
            day = int(timestamp//(60*60*24))
            return '{}天前'.format(day)
        elif timestamp >=60*60*24*30 and timestamp <60*60*24*365:
            mon = int(timestamp//(60*60*24*30))
            return '{}月前'.format(mon)
        elif timestamp >=60*60*24*365 and timestamp <60*60*24*365*2:
            year = int(timestamp//(60*60*24*365))
            return '{}年前'.format(year)
        elif timestamp>60*60*24*365*2:
            return '莫得了'
        else:
            return data.strftime('%Y-%m-%d %H:%M')
    else:
        return data

JS的Ajax响应生成

这个由于是从异步响应生成的数据。所以并不能在JS页面上面套进去,添加一个数据过滤器。所以要从数据源头下手。

news_info_list = []
        for n in news_info:
            news_info_list.append(
                # 过滤器
                n.to_put()
            )
data = {
'total_pages': paginator.num_pages,
'news': news_info_list,
}

第一个是从template里面的html下手,这次是从模型数据获取上面下手。然后返回一串json数据。

#   在News模型里面添加处理函数
from news.templatetags.date_filter import date_filter
def to_put(self):
        dict = {
            'id': self.id,
            'title': self.title,
            'digest': self.digest,
            'image_url': self.image_url,
            'tag_name': self.tag.name,
            'author': self.author.username,
            'update_time': date_filter(self.update_time),
        }
        return dict

 

posted @ 2020-04-28 16:52  我和姚明一样高  阅读(427)  评论(0编辑  收藏  举报