2015-02-06 35 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是什麼樣的情況下進行調試。