Django 模板未正确格式化 <pre> 标签

Posted

技术标签:

【中文标题】Django 模板未正确格式化 <pre> 标签【英文标题】:Django Template Not Formatting <pre> Tag Correctly 【发布时间】:2019-10-09 07:23:55 【问题描述】:

我正在尝试在带有 &lt;pre&gt; 标签的 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结果 会出现问题,因为string 有no .items() 【参考方案1】:

json.dumps [Pyton-doc] 的输出是string:

(...)

使用此转换表将 obj 序列化为 JSON 格式的str。参数与dump() 中的含义相同。

如果你想渲染结果,你可以用一个简单的方法来渲染它:

&lt;pre&gt;<b> json_data </b>&lt;/pre&gt;

因为它是string,这意味着它也没有.items(),因此% for k, v in json_data.items % 应该根本不会导致迭代。因此,看起来您将 json_data 对象以外的其他内容传递给了模板。

根据您的render(..) 调用,它应该如下所示:

&lt;pre&gt; <b>search_result.display</b> &lt;/pre&gt;

经过一番讨论,看起来 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> 标签的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板 - 列表未正确呈现

使用 Pygments 在 Django 项目中显示 <pre> 中的行号

图像未出现在 Django 模板 For Loop 中

Django 模板未接收上下文对象

模板中的 Django Json 响应格式

如何在 Django 模板中创建正确的路径