将来自 MongoDB 的 JSON 结果提供给 Django 模板视图不显示字典值
Feeding JSON results from MongoDB into Django Template view doesn't display dictionary values
我从 MongoDB 返回一个记录集,将其解析为 JSON 并将其推送到视图中并尝试访问模板中每条记录的字典值。我可以打印记录(作为单独的记录),但我无法将每条记录的结构作为字典访问。我怎样才能得到这些值?
def index(request):
results = settings.vali_collection.find({'index': [] })
json_docs = [json.dumps(doc, default=json_util.default) for doc in results]
return render(request, 'db.html', {'results': json_docs[0:3]})
在我的模板中:
{% for result in results %}
{{ result.name}}
{{ result.items.name}}
{% endfor %}
我的 JSON 看起来像:
{"name": "Travel & Leisure", .., ..}
我可以使用 {{record}}
在我的模板中打印记录,但是如何将记录作为字典获取?我上面的模板中的内容不起作用,returns 什么也没有。但是当我使用:
{% for result in results %}
{{ result}}
{% endfor %}
我可以将记录以 JSON 格式打印到屏幕上。如果我打印出 json_docs 我会得到以下信息:
['{"name": "random", "sector": "random"}', {"name": "random", "sector": "random"}', {"name": "random", "sector": "random"}']
像这样改变你的看法
def index(request):
results = settings.vali_collection.find({'index': [] })
return render(request, 'db.html', json.dumps({"results":results[0:3]}))
您现在可以使用 for 循环进行渲染
如果json本身就是一个字典,你需要有嵌套循环。类似于以下内容:
{%for i in gme%}
{%for l, k in i.items%}
<p> {{l}} {{k}} </p>
{%endfor%}
{%endfor%}
gme
看起来像这样:
gme = [{"sdfje": 'sdfs',"sdfds": "sdf"},...]
输出为:
sdfje sdfs
sdfds sdf
使用 json.loads(...)
而不是 json.dumps
。
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
Serialize obj to a JSON formatted str
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
Deserialize s (a str or unicode instance containing a JSON document) to a Python object using this conversion table.
你正在做的是将 python 字典序列化为 JSON formatted str
,所以你得到的是字符串而不是字典。
您需要反序列化,为此,您需要 json.loads
如果您不能使用json.loads
,正如您在评论部分所说,那么results
变量不是json string
。也许这就是您要找的东西?尝试调试看看里面有什么 results
如果您使用的是可以切片的 PyMongo 2.8
find
returns a Cursor
。这应该有效:
db.test.find()[20:25]
这也应该有效:
result = db.test.find()
...
sliced_result = result[20:25]
您不需要将结果转换为 JSON,您可以将 Cursor
转换为 list
并将其直接传递给模板,如下所示:
def index(request):
results = settings.vali_collection.find({'index': []})[:3]
return render(request, 'db.html', {'results': list(results)})
您需要使用list(results)
强制Cursor
执行查询。在您的模板中,您将有一个 dicts
的列表,所以这应该有效:
{% for result in results %}
{{ result.name }}
{{ result.items.name }}
{% endfor %}
result
应该是 dict
。我看到的唯一问题是 items
是 Django 中的模板函数,这可能会使正在阅读您的模板的人感到困惑,并且会阻止您执行以下操作:
{% for result in results %}
{% for attr_name, value in result.items %}
{{ attr_name }}: {{ value }}
{% endfor %}
{% endfor %}
内部 for
将显示您 MongoDB 集合中文档的每个属性及其值。
如果您使用的是不允许切片的旧版本 PyMongo
,您可能需要执行以下操作:
def index(request):
results = settings.vali_collection.find({'index': []}).limit(3)
return render(request, 'db.html', {'results': list(results)})
limit
限制 Cursor
.
返回的结果数
我认为模板中的 result
不是您所想的那样。让我们检查如下:
函数中index(request)
:
results = settings.vali_collection.find({'index': [] })
return 是一个类似字典的对象列表。
json_docs = [json.dumps(doc, default=json_util.default) for doc in results]
return 是 JSON 字符串的列表 (不是字典)。
所以稍后当您遍历子列表 json_docs[0:3]
时,您只是在遍历字符串列表,这就是为什么您不能引用 .name
和 .items
属性的原因。
看起来您真正想要的是模板中每个 result
的 dict()
类对象。为此,请避免将字典转储到 JSON.
所以代替:
# WRONG:
json_docs = [json.dumps(doc, default=json_util.default) for doc in results]
return render(request, 'db.html', {'results': json_docs[0:3]})
# /WRONG
...直接把结果传进去即可:
results = settings.vali_collection.find({'index': [] })
results = list(results) # This may or may not be necessary, depending on what mongo client you're using
return render(request, 'db.html', {'results' : results[:3])
然后在您的模板中,当您遍历 results
时,每个 result
应该是一个类似字典的对象,您可以在其上使用 result.name
或 result.items
。
顺便说一句,你代码中的 result.items.name
引用对我来说有点奇怪(就像 return 一个错误),但我很难在不知道每个 [=26] 是什么的情况下进行调试=] 看起来像。
我从 MongoDB 返回一个记录集,将其解析为 JSON 并将其推送到视图中并尝试访问模板中每条记录的字典值。我可以打印记录(作为单独的记录),但我无法将每条记录的结构作为字典访问。我怎样才能得到这些值?
def index(request):
results = settings.vali_collection.find({'index': [] })
json_docs = [json.dumps(doc, default=json_util.default) for doc in results]
return render(request, 'db.html', {'results': json_docs[0:3]})
在我的模板中:
{% for result in results %}
{{ result.name}}
{{ result.items.name}}
{% endfor %}
我的 JSON 看起来像:
{"name": "Travel & Leisure", .., ..}
我可以使用 {{record}}
在我的模板中打印记录,但是如何将记录作为字典获取?我上面的模板中的内容不起作用,returns 什么也没有。但是当我使用:
{% for result in results %}
{{ result}}
{% endfor %}
我可以将记录以 JSON 格式打印到屏幕上。如果我打印出 json_docs 我会得到以下信息:
['{"name": "random", "sector": "random"}', {"name": "random", "sector": "random"}', {"name": "random", "sector": "random"}']
像这样改变你的看法
def index(request):
results = settings.vali_collection.find({'index': [] })
return render(request, 'db.html', json.dumps({"results":results[0:3]}))
您现在可以使用 for 循环进行渲染
如果json本身就是一个字典,你需要有嵌套循环。类似于以下内容:
{%for i in gme%}
{%for l, k in i.items%}
<p> {{l}} {{k}} </p>
{%endfor%}
{%endfor%}
gme
看起来像这样:
gme = [{"sdfje": 'sdfs',"sdfds": "sdf"},...]
输出为:
sdfje sdfs
sdfds sdf
使用 json.loads(...)
而不是 json.dumps
。
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
Serialize obj to a JSON formatted str
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
Deserialize s (a str or unicode instance containing a JSON document) to a Python object using this conversion table.
你正在做的是将 python 字典序列化为 JSON formatted str
,所以你得到的是字符串而不是字典。
您需要反序列化,为此,您需要 json.loads
如果您不能使用json.loads
,正如您在评论部分所说,那么results
变量不是json string
。也许这就是您要找的东西?尝试调试看看里面有什么 results
如果您使用的是可以切片的 PyMongo 2.8
find
returns a Cursor
。这应该有效:
db.test.find()[20:25]
这也应该有效:
result = db.test.find()
...
sliced_result = result[20:25]
您不需要将结果转换为 JSON,您可以将 Cursor
转换为 list
并将其直接传递给模板,如下所示:
def index(request):
results = settings.vali_collection.find({'index': []})[:3]
return render(request, 'db.html', {'results': list(results)})
您需要使用list(results)
强制Cursor
执行查询。在您的模板中,您将有一个 dicts
的列表,所以这应该有效:
{% for result in results %}
{{ result.name }}
{{ result.items.name }}
{% endfor %}
result
应该是 dict
。我看到的唯一问题是 items
是 Django 中的模板函数,这可能会使正在阅读您的模板的人感到困惑,并且会阻止您执行以下操作:
{% for result in results %}
{% for attr_name, value in result.items %}
{{ attr_name }}: {{ value }}
{% endfor %}
{% endfor %}
内部 for
将显示您 MongoDB 集合中文档的每个属性及其值。
如果您使用的是不允许切片的旧版本 PyMongo
,您可能需要执行以下操作:
def index(request):
results = settings.vali_collection.find({'index': []}).limit(3)
return render(request, 'db.html', {'results': list(results)})
limit
限制 Cursor
.
我认为模板中的 result
不是您所想的那样。让我们检查如下:
函数中index(request)
:
results = settings.vali_collection.find({'index': [] })
return 是一个类似字典的对象列表。json_docs = [json.dumps(doc, default=json_util.default) for doc in results]
return 是 JSON 字符串的列表 (不是字典)。
所以稍后当您遍历子列表 json_docs[0:3]
时,您只是在遍历字符串列表,这就是为什么您不能引用 .name
和 .items
属性的原因。
看起来您真正想要的是模板中每个 result
的 dict()
类对象。为此,请避免将字典转储到 JSON.
所以代替:
# WRONG:
json_docs = [json.dumps(doc, default=json_util.default) for doc in results]
return render(request, 'db.html', {'results': json_docs[0:3]})
# /WRONG
...直接把结果传进去即可:
results = settings.vali_collection.find({'index': [] })
results = list(results) # This may or may not be necessary, depending on what mongo client you're using
return render(request, 'db.html', {'results' : results[:3])
然后在您的模板中,当您遍历 results
时,每个 result
应该是一个类似字典的对象,您可以在其上使用 result.name
或 result.items
。
顺便说一句,你代码中的 result.items.name
引用对我来说有点奇怪(就像 return 一个错误),但我很难在不知道每个 [=26] 是什么的情况下进行调试=] 看起来像。