在Django模板中使用json.dump或pprint逐行创建字典表格 [python]

2 投票
1 回答
612 浏览
提问于 2025-04-20 02:02

我最近一直在为这个问题苦恼,不知道是继续努力解决,还是去看医生。

我在查询一个API来获取json格式的信息。我使用的是requests库,而我用的requests-tool的一个很酷的功能是可以调用.json(),这样就能把数据转换成Python中的字典。现在问题来了;我已经把所有数据保存成我想要的格式,现在我想把这些json数据打印成HTML表格的形式,或者逐行显示,同时保持json.dumps应用的缩进,这样我就可以逐行添加一些标签。[见下面的例子]

json.dumps()在以预格式块显示数据方面表现得很好,但现在我卡在了如何让django模板重新组织这些数据。

在我看到的大多数json.dumps()的例子中:

    {
        "a" :"string"
        "b" :"string2"
        "c" : [
            "yup",
            "yup",
            "blegh"
        ]
        "d" : {
            "another_dict": {
                "another_dict_to_make_it_tricky" : "string!"
            }
        }
    }

而我想要的,或者说我想用模板做的事情,是保持缩进。


    table
    row {
    row    "a" :"string"  (search-value-icon)
    row    "b" :"string2" (search-value-icon)
    row    "c" : [        (collapsible)
    row        "yup",
    row        "yup",
    row        "blegh"
    row    ]
    row    "d" : {        (collapsible)
    row        "another_dict": {               (collapsible)    
    row            "another_dict_to_make_it_tricky" : "string!" (search-value-icon)
    row        }
    row    }
    row }

到目前为止,我尝试过创建一个过滤器jsondump来在模板中返回json字符串,但当我试图将其传递给另一个过滤器str_seperate时,它失败了。我还尝试了其他方法,但大多数情况下返回到模板的信息都丢失了缩进。

[基本上; {% dict_type_from_view |jsondump |str_split %}]

    @register.filter
    def jsondump(obj):
        return json.dumps(obj,indent=4)
    @register.filter
    def str_split(obj):
        return obj.split(',')

有没有什么优雅的方法可以做到这一点,同时保持缩进?

1 个回答

1

在json.dumps()这个函数里,你需要设置一个叫做indent的属性。还有,你要用'\n'作为分隔符来分开内容,因为如果不这样做,Python会自动处理空格,可能会让结果变得奇怪。最后一步就是把带有前导空格的字符串渲染成一些HTML格式。

你可以试试这个:

import json
import re
from django import template

register = template.Library()


@register.filter
def my_filter(value):
    string = json.dumps(value, indent=4)
    result = '<div style="font-family:monospace;">'
    for row in string.split('\n'):
        content = re.sub(r'\s{4}', '<span style="padding-right:1em;">&nbsp;</span>', row.rstrip())
        result += '<p>%s</p>' % content
    result += '</div>'
    return result

在模板里,别忘了使用safe,但要确保内容真的安全。

{{ my_dict|my_filter|safe }}

撰写回答