Django 模板未正确格式化 <pre> 标签
Posted
技术标签:
【中文标题】Django 模板未正确格式化 <pre> 标签【英文标题】:Django Template Not Formatting <pre> Tag Correctly 【发布时间】:2019-10-09 07:23:55 【问题描述】:我正在尝试在带有 <pre>
标签的 Django 模板中显示原始 json 数据。
我在几个地方都有这个工作,但由于某种原因,我的一个 json 样本无法正常工作。
为了获取 json,我使用了一个带有嵌套列表和字典的 python 字典。然后我通过json.dumps()
运行它来获取我的json。它看起来像这样:
data = 'parent_key': 'key1': 'value1', 'key2': 'value2', 'key3': ['obj1', 'obj2', 'obj3'], 'problem_key': ['problem_data1', 'problem_data2', 'problem_data3']
json_data = json.dumps(data, indent=4)
使用我的其他字典,效果很好 - 预期输出是“漂亮”格式的 json - 即:
parent_key
"key1": "value1",
"key2": "value2",
"key3": [
"obj1",
"obj2",
"obj3",
],
"problem_key": "[\n \"problem_data1\",\n \"problem_data2\",\n \"problem_data3\"\n ]
在 Django 模板中,我的代码如下所示:
% for k, v in json_data.items %
<pre> k v </pre>
% endfor %
您可以正确看到大多数数据格式,但最后一部分实际上打印换行符而不是格式化它们。
有什么想法吗?
编辑 - 渲染 下面 - search_result['display'] 是一个普通的 dic
search_result['display'] = json.dumps(search_result['display'], indent=4)
return render(request, 'iocs/ioc_check.html', 'search_result': search_result, 'pp_result': pp_data, 'url_haus': url_haus_,
'envcount': envcount)
编辑 - 实际输出
www.google.com.dns-report.com
"Source": "CrowdStrike-Intel",
"Malicious_Confidence": "high",
"First_Seen": "2019-05-07 14:10:26",
"Last_Seen": "2019-05-15 20:31:17",
"TISAG_SEIR": "TISAG-SEIR",
"Malware": [
"FakeDead"
],
"Threat_Type": "Error",
"Kill_Chain": [
"C2"
],
"Tags": [
"domain",
[
"C2"
],
[
"FakeDead"
]
],
"Additional_Context": "[\n \n \"indicator\": \"4e85c248eab9eedd3941640699cb1c4b\",\n \"type\": \"hash_md5\",\n \"created_date\": \"2019-05-07 14:10:26\",\n \"last_valid_date\": \"2019-05-07 14:10:26\"\n ,\n \n \"indicator\": \"96723797870a5531abec4e99fa84548837e9022e9f22074cf99973ab7df2a2e7\",\n \"type\": \"hash_sha256\",\n \"created_date\": \"2019-05-07 14:10:26\",\n \"last_valid_date\": \"2019-05-07 14:10:26\"\n ,\n \n \"indicator\": \"ff166de7d1b17a008e5bc3f3356fbf2dbe4906ec\",\n \"type\": \"hash_sha1\",\n \"created_date\": \"2019-05-07 14:10:26\",\n \"last_valid_date\": \"2019-05-07 14:10:26\"\n \n]"
【问题讨论】:
这很正常,你应该使用|safe
模板过滤器。
@WillemVanOnsem 我是新手,你能链接到一些文档吗?
等一下,json_data
是一个字符串,对吗?
我相信是的
你能在这里显示你如何调用render(..)
。我很确定通过json.dumps
的结果 会出现问题,因为str
ing 有no .items()
。
【参考方案1】:
json.dumps
[Pyton-doc] 的输出是str
ing:
(...)
使用此转换表将 obj 序列化为 JSON 格式的
str
。参数与dump()
中的含义相同。
如果你想渲染结果,你可以用一个简单的方法来渲染它:
<pre><b> json_data </b></pre>
因为它是str
ing,这意味着它也没有.items()
,因此% for k, v in json_data.items %
应该根本不会导致迭代。因此,看起来您将 json_data
对象以外的其他内容传递给了模板。
根据您的render(..)
调用,它应该如下所示:
<pre> <b>search_result.display</b> </pre>
经过一番讨论,看起来 API 响应的一部分是 JSON 格式的,所以在这种情况下,最好先用 JSON 加载该部分,然后为整个字典制作一个 JSON 转储并像上面讨论的那样渲染它.
【讨论】:
我添加了这个更改,但我的显示没有任何变化。仍然没有正确格式化 我会尝试,但我认为它的工作方式是我有一个 dic - 键是正常的,值是 str json 数据。唯一的迭代是打印与您在这里相同的值 @Joe:但您应该在此处打印值,而不是列表,否则您将打印值的repr(..)
。这与 Django 无关,但与 Python 格式列表的方式有关,因此您的 JSON 序列化将被省略。
我最初正在尝试,但我一定是做错了什么 - 当我试图打印它时 search_result.display
没有打印 - 但是当我循环时,我得到了预期的结果 - 我不知道为什么。
所以我得到了完全相同的结果。前半部分格式正确,但最后部分正在打印 \n
字符,什么不是【参考方案2】:
Willem Van Onsem 在 cmets 中为我解决了这个问题。我想发布答案,以防其他人有这个问题。
打印奇怪的原因是我的最终结果的一小部分已经从 JSON 转换为字符串。为了解决这个问题,我只是将整个数据集推回json.loads()
,然后将其重新转储回json.dumps()
。一旦我这样做了,它就可以正常工作了。
【讨论】:
以上是关于Django 模板未正确格式化 <pre> 标签的主要内容,如果未能解决你的问题,请参考以下文章