将来自 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 属性的原因。

看起来您真正想要的是模板中每个 resultdict() 类对象。为此,请避免将字典转储到 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.nameresult.items

顺便说一句,你代码中的 result.items.name 引用对我来说有点奇怪(就像 return 一个错误),但我很难在不知道每个 [=26] 是什么的情况下进行调试=] 看起来像。