如何从 Jinja2 模板中的 JSONField 渲染任意一组键->值对?

问题描述 投票:0回答:2

我正在尝试将调试信息添加到前端;由于目前不需要讨论的原因,我将相关信息存储在 JSONField 中。

存储和检索信息工作正常,但是当我尝试通过 J2 将其呈现到应该位于的页面时,我遇到了一些问题。

这是有问题的片段:

          {% for log in connection.debug_logs.all %}
            <tr>
                <td></td>
                <td>{{ log.log_message }}</td>
                <td>
                    {% for key in log.log_data %}
                      {{ key }}: {{ log.log_data.key }} <br/>
                    {% endfor %}
                </td>
            </tr>
          {% endfor %}

希望是产生一系列

key: value
的线条。我得到的相反是:

                <td>Login requested by vmx1.internal (11.22.33.44)</td>
                <td>
                      Framed-Route:  <br/>
                      Service-Type:  <br/>
                      Framed-IP-Address:  <br/>
                      Framed-IPv6-Route:  <br/>
                      control:Auth-Type:  <br/>
                      Framed-IPv6-Prefix:  <br/>
                      Delegated-IPv6-Prefix:  <br/>
                      ERX-Egress-Policy-Name:  <br/>
                      ERX-Ingress-Policy-Name:  <br/>
                      ERX-Virtual-Router-Name:  <br/>
                      control:Cleartext-Password:  <br/>
                </td>

使用

{{ log.log_data | pprint }}
确实会产生键和值,但将它们呈现为纯文本 JSON 字符串,该字符串会被 html 渲染器压平,并且对于调试目的不是很有用。

尝试“log.log_data[key]”会产生“无法解析其余部分”错误。

我已经尝试过这个问题中的建议以及这些以及谷歌搜索期间出现的其他一些建议,但它们似乎都没有解决这个问题——它们都使用已知的密钥,使用实际的字典而不是 JSONField,或者有时两者都使用。

我可能错过了一些非常简单明了的东西,但我已经没有办法在搜索引擎中表达我的问题了。有什么建议吗?

编辑不,它实际上不是一本字典。我也尝试了这个答案中的解决方案,这导致了Could not parse the remainder

错误。

所以我正在寻找的数据绝对存在,我只是在尝试让它正确渲染时遇到问题。

第三次也是最后一次编辑:问题显然是 Django 模板不完全 Jinja2 模板,而不是 {% for key, value in log.log_data.items() %}

 我需要使用 
{% for key, value in log.log_data.items %}

    

django jinja2 django-jsonfield
2个回答
1
投票
在视图中进行 json 转换,以获得比 jinja2 模板世界更广泛的实用程序。

import json DEBUG_LOGS_JSON = "[ {"log_data": {"Framed-Route": "route1", "Service-Type": "type1"}, "log_message": "my"}, {"log_data": {"Framed-Route": "route2", "Service-Type": "type2"}, "log_message": "name"}, {"log_data": {"Framed-Route": "route3", "Service-Type": "type3"}, "log_message": "Tarquinius"}, ]" def my_view(request): my_dict = json.loads(DEBUG_LOGS_JSON) # instead you could also restructure the data passed to the template here. return render("my_template.html", context=my_dict)
{% for dictionary in my_dict %}
<tr>
  <td>{{ dictionary.log_message }}</td>
  <td>
    {% for key, value in dictionary.log_data.items() %}
    {{ key }}: {{ value }} <br/>
    {% endfor %}
  </td>
</tr>
{% endfor %}
如果这不能代表您的 json 结构,请提供一个示例。让我知道进展如何。


0
投票
经过一番撕心裂肺之后,我发现 Django 模板与 Jinja2 模板

不太完全相同。

具体来说,J2文档告诉我要写成什么

{% for key, value in log.log_data.items() %}
本来应该是

{% for key, value in log.log_data.items %}
这很有效,并得到了我正在寻找的输出。我将其作为答案留在这里,以防其他人遇到同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.