让 Django 以更自然的方式显示 Json 文本
在 Django 实现保存前备份原记录数据 一文是我们介绍了如何对记录数据进行 josn 序列化以达到把记录备份到文本字段的目的,但如果我们要查看数据是这样:
[{"pk": 2, "fields": {"record_date": "2016-11-27T13:22:00Z", "brand": "DELL",
"production_date": "2016-07-01", "model": "XPS13", "name": "我的 Dell 开发笔记本",
"status": 1}, "model": "device.deviceinfo"}]
长长一串的数据显然不符合我们的显示要求,那么如何改进,让 json 数据显示的格式自然而且规范呢,如果是下面这样,是不是效果就好多了:
[
{
"fields": {
"brand": "DELL",
"model": "XPS13",
"name": "我的 Dell 开发笔记本",
"production_date": "2016-07-01",
"record_date": "2016-11-27T13:22:00Z",
"status": 1
},
"model": "device.deviceinfo",
"pk": 2
}
]
那么怎样来实现这样的效果?
在上述一文中我们创建了一个 History
模型,下面我们改进一下。
文件: log/models.py
class History(models.Model):
"""数据历史记录"""
model = models.CharField('数据模型', max_length=50)
pkey = models.IntegerField('记录号')
json = models.TextField('JSON 数据')
log_time = models.DateTimeField('记录时间', auto_now_add=True)
class Meta:
verbose_name_plural = verbose_name = '历史记录'
def __str__(self):
return '%s(%s)' % (self.model, self.pkey)
def natural_json(self):
"""in template file, use <pre>{{ object.natural_json }}</pre> to show natural json data. """
return json.dumps(json.loads(self.json), indent=4,
ensure_ascii=False, sort_keys=True)
natural_json.short_description = 'JSON 格式文本'
在模型里,我们加了一个虚拟字段 natural_json
来生成缩进和进行排序。在页面中,我们只要原样输出即可,所以可以用 <pre>
标签把它框起来。
我们用一个简单的示例来实现它:
先来实现视图部分
文件: log/views.py
from django.views.generic import DetailView
from .models import *
# Create your views here.
class HistoryDetailView(DetailView):
model = History
# template_name = 'log/history_detail.html'
然后模板部分:
文件: log/templates/log/history_detail.html
{% extends "admin/base.html" %}
{% block content %}
<h2>数据历史记录</h2>
<p>模型:{{ object.model }}</p>
<p>记录:{{ object.pkey }}</p>
<p>数据:<br><pre>{{ object.natural_json }}</pre></p>
<p>时间:{{ object.log_time|date }}</p>
{% endblock %}
这里我们加了 <pre>
标签让 natural_json
数据原样输出。
再来 urls
部分
文件: log/urls.py
from django.conf.urls import url
from .views import *
urlpatterns = [
...
url(r'^history_detail/(?P<pk>\d+)/$', HistoryDetailView.as_view(), name='history-detail'),
]
当然,项目的 urls.py
也要维护一下。
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^log/', include('log.urls', namespace='log')),
]
把网站服务运行起来: ./manage.py runserver
现在就可以在浏览器里输入: http://127.0.0.1:8000/log/history_detail/15/
来看看效果如何?
数据历史记录
模型:device.deviceinfo
记录:2
数据:
[
{
"fields": {
"brand": "DELL",
"model": "XPS13",
"name": "我的 Dell 开发笔记本",
"production_date": "2016-07-01",
"record_date": "2016-11-27T13:22:00Z",
"status": 1
},
"model": "device.deviceinfo",
"pk": 2
}
]
时间:十一月 28, 2016
Good!这就是我们要的效果了~~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论