在 Django 模板中迭代 JSON

Posted

技术标签:

【中文标题】在 Django 模板中迭代 JSON【英文标题】:Iterating JSON in a django template 【发布时间】:2015-12-10 09:42:43 【问题描述】:

我有一个来自以下格式视图的 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)

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

【问题讨论】:

AllUser 有什么类型?是字符串类型吗? @user2172884 : JSON....从redis 通过json.loads 挑选 你能发布repr(AllUser)type(AllUser)的准确输出吗? 在 VIEW 中尝试 => 打印 => JSON 我在上面发布并输入 => <class 'django.http.response.JsonResponse'>, 你能发布整个代码生成AllUser吗? JsonResponse 不应该是 json.loads 返回的对象类型,所以你肯定在做一些不同于上面评论中描述的事情 【参考方案1】:

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

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

"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": "",

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

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

pip install requests[security]

需要 [security] 标志才能从 HTTPS 成功响应

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>

就是这样!祝你工作愉快! 如果您乱来,您可以事件获取此请求的标头;-)

【讨论】:

【参考方案2】:

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

创建一个文件 mytags.py 为&lt;your-app&gt;/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

【讨论】:

以上是关于在 Django 模板中迭代 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中迭代字典的列表值

迭代 django 表单结果(不在模板中)

Django模板:获取嵌套循环的总迭代次数

如何在模板中迭代 python-django 循环 N 次?

在 Django 模板中迭代 Expando 的动态属性

如何在django html模板中迭代列表[重复]