先说一下配置:
Django:2.1.8
Python:3.6.4
project的名称是:naxx
APP的名称是:naxxramas
template的除法与as
我们在用Django搭配平台API的时候,经常会得到各种各样形式的数据。那么views.py
获取到这些数据之后,需要通过template
向前端展示。但是往往由于API数据的格式多种多样,比如API提供的是时间戳timestamp,而前端需要展示的是可读的时间,这种变化怎么办?
比如我们公司的一个监控系统,对外暴露的API格式如下:
1
{"data":{"attends":null,"metadata":null,"result":[{"timestamp":1598369220000,"avg_cpu":1.6593},{"timestamp":1598369280000,"avg_cpu":1.6854},{"timestamp":1598369340000,"avg_cpu":1.6552},{"timestamp":1598369400000,"avg_cpu":1.7705}]},"message":"","success":true,"totalCount":null}
可以看出返回的是某个应用最近5分钟的CPU情况。那么如果要展示到前端,就需要对timestamp
进行二次加工。原来的代码是:
1
2
3
4{% for app in data %}
{{ app.timestamp }}
{{ app.avg_cpu }}
{% endfor %}
首先第一步,timestamp
这个值并不是一个正确的时间戳,如图:
可见它是真实时间戳的1000倍,所以我们要先将其除以1000。那么更改代码如下:
这里就达到了将原来app.timestamp
除以1000的效果。但是要注意,这样就不能继续加工了,即在后面加上|date:"D d M Y" %}
这个过滤器是会报错的,因为widthratio
只能接受int类型。
既然这样,我们就中转一下使用as
,改成这样:
这里通过as
来解决问题,先用除法将结果赋予timestamp
,然后再对timestamp
进行print_timestamp
的加工展示。
自定义template过滤器
在上面那个例子里,我用了print_timestamp
这个模板过滤器,这是一个自定义的过滤器,因为Django2目前没有官方的时间戳转时间的过滤器。所以就要手写一个,手写的过程如下:
首先现在你的App文件夹里,创建一个空文件夹templatetags
,里面先创建一个空文件__init__.py
。这个空文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数。
然后再创建一个叫timetages.py
的文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13from django import template
import datetime
register = template.Library()
def print_timestamp(timestamp):
try:
#assume, that timestamp is given in seconds with decimal point
ts = float(timestamp)
except ValueError:
return None
return datetime.datetime.fromtimestamp(ts)
register.filter(print_timestamp)
如果你要精确到小时分秒这个级别的话,上面的代码就要对应补充和修改一下:
1
2
3
4
5import time
def print_timestamp(timestamp):
...
#specify format here
return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(ts))
然后在对应的html文件里,添加load 文件名
,注意是文件名不是文件里的函数名,如图:
此时我们自定义的print_timestamp
函数就OK了,重启一下django,一定要重启,看看效果吧!
参考资料
https://blog.csdn.net/u011181633/article/details/79337369
https://stackoverflow.com/questions/10715253/display-timestamp-in-django-template