2017-10-05 85 views
0

我有這樣的集合:如何使用集合在Django模板

data[1]['Monday'] = 2 
data[1]['Tuesday'] = 2 
data[2]['Monday'] = 5 
data[2]['Tuesday'] = 7 

,並想在Django模板中使用它。 當我這樣做:

{{ data}} 

一切都顯示正確。但如果我嘗試如: {{data.1}}

然後我看到空集合。 有誰知道爲什麼?

由於提前,

+0

「data」是什麼類型?一個'字典'?一個'列表'?還有別的嗎?當你說你「看到空的收藏」時,你會得到什麼_exactly_? (請生成html)。 –

+0

類型是字典,我得到「defaultdict(<函數rec_dd在0x7fc95115ec08>,{})」 –

+0

你可以嘗試在你的視圖中手動構建的'dict':'data = {1:{「Monday」 2,「星期二:2」,2:{「星期一」:5,「星期二」:7}}??在模板中顯示「{{data}}」和「{{data.1}}」? –

回答

1

TL; DR:避免將defaultdicts到Django模板,如果你喜歡你的心理健康;)

OK了OP找到了解決方法,並這樣做使我明白了什麼問題真的是,所以我想我會發布這個答案無論如何,因爲它是一種明顯的,一次你想出它的行爲,可以讓你寬鬆時間和不少頭髮。

這裏的問題是Django模板如何查找值以及defaultdict如何工作的組合。要解決{{ data.1 }},Django不知道是否1應該是一個int(1)或字符串(u"1"),所以它首先調用data.__getitem__()以字符串u"1"然後 - 如果調用提出了KeyError - 與INT 1。這可使用此代碼(py2.7.x,Django的1.10.x)中可以看出:

>>> from django.template import Template, Context 
>>> class DW(dict): 
...  def __getitem__(self, key): 
...   print "DW.__getitem__(<%s> %r)" % (type(key), key) 
...   return super(DW, self).__getitem__(key) 
... 
>>> dw = DW() 
>>> tpl = Template("this is '{{ data.1 }}'") 
>>> tpl.render(Context({"data": dw})) 
DW.__getitem__(<<type 'unicode'>> u'1') 
DW.__getitem__(<<type 'int'>> 1) 
u"this is ''" 

現在的問題是,有defauldict不僅鍵創建鍵查找丟失的鑰匙(在__getitem__)分配(__setitem__),作爲一個可以很容易地自行檢查:

>>> from collections import defaultdict 
>>> dd = defaultdict(int) 
>>> dd 
defaultdict(<type 'int'>, {}) 
>>> dd["1"] 
0 
>>> dd 
defaultdict(<type 'int'>, {'1': 0}) 
>>> dd[1] 
0 
>>> dd 
defaultdict(<type 'int'>, {'1': 0, 1: 0}) 
>>> 

現在由於OP是使用defaultdict爲int鍵和Django的第一個用繩子嘗試,在defaultdict會默默地創建了一個新條目(失蹤)u"1"鍵並返回默認值(在這種情況下是一個空字典)。

+0

感謝您的解釋 –