无法获取Django模板来打印格式化的JSON

时间:2017-06-03 15:48:59

标签: python json django

我正在努力从Watson的NLU API打印格式化的JSON响应。我正在使用Python 2.7和Django 1.11。我的views.py看起来像这样:

def nlu_analysis(request):
    if request.method == 'POST':
        text2send = request.POST.get('text2send')
        natural_language_understanding = NLUV1(
            version='2017-02-27',
            username='####',
            password='####')

    response = natural_language_understanding.analyze(
        text=text2send,
        features=[features.Entities(), ... features.SemanticRoles()])

        parsedData = json.dumps(response, indent=2)
    return render(request, 'analysis.html', {'data': parsedData})

我的analysis.html看起来像这样:

  <div class="container text-left">
      <p>{{ data }}</p>
  </div>

所有这一切的结果都是数据,JSON括号打印在一行上,如下所示:

{“semantic_roles”:[{“action”:{“text”:“are”,“verb”:{“text”:“be”,“tense”:“present”},“normalized “:”是“},”句子“:”蝙蝠侠和超人正在与坏人战斗“,......”关键词“:[{”相关性“:0.931284,”文字“:”坏人“},{”相关性“:0.790756,”text“:”超人“},{”相关性“:0.752557,”文字“:”蝙蝠侠“}}}

如果我在for循环中运行

<div class="container text-left">
    {% for d in data %}
        <p>{{ d }}</p>
    {% endfor %}
</div>

它只是在每行的字符上打印

{

小号

ë

...

建议{{data}}是一个字符串,仅此而已。

显然,我从根本上误解了一些事情。它是关于json.dumps(包括'indent = 2')如何工作或如何在我的模板中正确处理它的东西。我怀疑后者因为通过'data'传递的信息显然包含所有JSON语法。如果我将结果上面的一行结果放在JSON验证器中,它会完全重新格式化和验证。

那里有一个完整的新手的任何帮助?感谢。

2 个答案:

答案 0 :(得分:0)

为什么你甚至要解析你的回复。 json.dumpsdict对象转换为字符串。您可以直接将其用作return render(request, 'analysis.html', {'data': response})

答案 1 :(得分:0)

如果要访问dict对象中键的值,只需要这样做(对于您的示例数据),

{{ response.semantic_roles }}

如果模板上下文中存在semantic_roles,那么response将被解释为文字字符串而不使用变量“semantics”的值。 from django.template.defaulttags import register @register.filter def get_item(dictionary, key): return dictionary.get(key) 是上下文变量的名称。

或者,如果您想使用循环获取dict对象中每个键的值,您可能需要为模板创建自定义过滤器,

{% for key in response %}
{{ response|get_item:key }}
{% endfor %}

在你的模板中,

<a href="#" id="abc">jhg</a>
<a href="#" id="myLink">jhhghj</a>

<script type="text/javascript">
   document.getElementById("myLink").onclick = function() {
   document.getElementById("abc").href="xyz.php"; 
   return false;
};
</script>

当然,请确保在模板标记上调用load,以便渲染器可以看到它们。

以下是一些有用的链接,