2015-02-06 37 views
0

我从MongoDB返回一个记录集,将其解析为JSON并将其推入视图并尝试访问模板中每个记录的字典值。我可以打印记录(作为单个记录),但是我无法以字典的形式访问每个记录的结构。我怎样才能看到价值?将MongoDB的JSON结果送入Django模板视图不显示字典值

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}}打印的记录,但我怎么在纪录一本字典?我在模板中的上述内容不起作用,不会返回任何内容。但是当我使用:

{% for result in results %} 
    {{ result}} 
{% endfor %} 

我可以记录打印出来,以屏幕JSON格式。如果我打印出来json_docs我得到如下:

['{"name": "random", "sector": "random"}', {"name": "random", "sector": "random"}', {"name": "random", "sector": "random"}'] 
+0

结果= settings.vali_collection.find({'index':[]})''返回? – styvane 2015-02-09 12:30:47

回答

2

如果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

+0

谢谢,但这是我尝试的第一件事情之一。不知何故,该模板没有看到作为字典的结果 - 因此我无法打印出键。 – disruptive 2015-02-09 10:49:02

+0

@Navonod你可以在return语句之前调试或打印'json_docs'的内容吗? – khajvah 2015-02-09 10:58:13

+0

我得到了我所期望的词典列表 – disruptive 2015-02-09 11:09:53

-1

更改您的视图这样

def index(request): 
    results = settings.vali_collection.find({'index': [] }) 

    return render(request, 'db.html', json.dumps({"results":results[0:3]})) 

现在,您可以使用您的for循环来渲染

+0

这不起作用 - 结果在:执行查询后无法设置选项 – disruptive 2015-02-09 10:44:25

+0

@Navonod您使用的是MongoDB库?在PyMongo 2.8中,这应该起作用。 – 2015-02-10 03:40:32

+0

@Navonod你可以显示你的结果吗? – itzMEonTV 2015-02-10 11:53:48

1

如果您使用PyMongo 2.8find回报Cursor可以切片。这应该工作:

db.test.find()[20:25] 

,这也应该工作:

result = db.test.find() 
... 
sliced_result = result[20:25] 

你并不需要的结果转化为JSON,你可以改变Cursorlist,并直接传递到模板,这样的:

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返回结果的数量。

1

我相信result在模板中并不是你认为的那样。让我们来看看如下:

在功能index(request)

  • results = settings.vali_collection.find({'index': [] })返回字典对象的列表。

  • json_docs = [json.dumps(doc, default=json_util.default) for doc in results]返回JSON列表字符串(不是字典)。

所以以后当你通过子表json_docs[0:3]迭代上,您仅仅是一个字符串列表,这就是为什么你不能引用.name.items性能迭代。

它看起来像你真正想要的是dict()像你的模板中的每个result对象。为此,请避免将字典转储为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引用对我来说看起来有点奇怪(就像它会返回一个错误),但是我很难在不知道每个record是什么样的情况下进行调试。