在django模板中迭代JSON

时间:2015-09-14 11:43:18

标签: json django for-loop django-templates iteration

我有一个json来自变量(AllUsers)中以下格式的视图:

{
  "msg": "data found.",
  "user": [
    {
      "fname": "aaa",
      "lname": "aaa",
      "add": "add1",
      "city": "city1",
    },
    {
      "fname": "aaa2",
      "lname": "aaa2",
      "add": "add2",
      "city": "city2",
    }
  ],
  "data_status": "active",
  "error": false
}

我需要在我的模板中迭代这个JSON并以下面的格式打印。理想情况下,我的循环应该在这种情况下运行2次。

name : aaa
name : aaa2

我试过了:

{% for myusers in AllUsers %}
       name : {{ user.fname}}
{% end for%}

{%with myusers=AllUsers.user%}
{% for user in myusers %}
name : {{ user.fname}}  
{% endfor %}
{% endwith %}

但是他们两个都没有工作,因为循环甚至没有迭代一次。在其中一个SO线程中我读了 ....你不应该将它转换为JSON"。 ...... 但这不在我手里......我只是得到了JSON。

Views看起来像这样:

def somefucn(request):
    data = {
        "msg": "data found.",
        "AllUsers": AllUser                    ## This is where the above JSON resides
        "data_status": "active",
        "error": false
    }
    return TemplateResponse(request, 'path/to/Template.html', data)

我在迭代中哪里出错了?请帮忙..

2 个答案:

答案 0 :(得分:4)

您可以使用模板过滤器在模板中加载json。

将文件mytags.py创建为<your-app>/templatetags/mytags.py

mytags.py的内容为:

import json

from django import template

register = template.Library()

@register.filter
def loadjson(data):
    return json.loads(data)

然后在你的django .htm / .html模板中加载标签。例如:

{% load mytags %}


{% for foo in YourJsonData|loadjson %}
    {{ foo.something }}
{% endfor %}

希望这有帮助。

有关高级模板的详细信息,请参阅:http://www.djangobook.com/en/2.0/chapter09.html#extending-the-template-system

答案 1 :(得分:4)

解决方案比我想象的容易得多:

假设您有一些类似于POST请求的JSON,其架构如下:

"success": true,
  "users": [
    {
      "userId": "76735142",
      "username": "user11_01",
      "email": "test11@test.com",
      "isTest": false,
      "create_at": "2016-01-29T15:41:16.901Z",
      "isBlocked": false
    }

(以上方案中的所有值都作为示例给出)

而且您知道要正确获得此响应,您需要在帖子正文中使用下一个变量:

{
"id": "",
"pass_code": "",
"search_for": "",
}

接下来,您需要将带有所需值的POST请求发送到API服务器:

首先,您需要安装必要的组件(来自您的virtualenv):

pip install requests[security]
为了从HTTPS

成功响应,需要

[security]标志

<强> VIEWS.PY

import requests
from django.shortcuts import render_to_response

def get_user(request):
    args = {}
    args.update(csrf(request))
    post_data = {'id': '1234', 'pass_code': 'pass', 'search_for': '123456'}
    response = requests.post('https://example.com/api/', data=post_data)
    args['contents'] = response.json()
    return render_to_response('your_templae.html', args)

<强> YOUR_TEMPLATE.HTML

<html>
<head>
<title>testing JSON response</title>
</head>
<body>
<div>
{% for user in contents.users %}
    {{ user.userId}}<br>
    {{ user.username}}<br>
{% empty %}
    Nothing found
{% endfor %}
</div>
</body>
</html>

就是这样!干得好! 如果你乱七八糟,你可以事件获取此请求的标题;-)