让 Django 以更自然的方式显示 Json 文本

发布于 2024-09-06 05:01:13 字数 3773 浏览 20 评论 0

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

仅一夜美梦

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文