在 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 为<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
【讨论】:
以上是关于在 Django 模板中迭代 JSON的主要内容,如果未能解决你的问题,请参考以下文章