我有這樣的集合:如何使用集合在Django模板
data[1]['Monday'] = 2
data[1]['Tuesday'] = 2
data[2]['Monday'] = 5
data[2]['Tuesday'] = 7
,並想在Django模板中使用它。 當我這樣做:
{{ data}}
一切都顯示正確。但如果我嘗試如: {{data.1}}
然後我看到空集合。 有誰知道爲什麼?
由於提前,
我有這樣的集合:如何使用集合在Django模板
data[1]['Monday'] = 2
data[1]['Tuesday'] = 2
data[2]['Monday'] = 5
data[2]['Tuesday'] = 7
,並想在Django模板中使用它。 當我這樣做:
{{ data}}
一切都顯示正確。但如果我嘗試如: {{data.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"
鍵並返回默認值(在這種情況下是一個空字典)。
感謝您的解釋 –
「data」是什麼類型?一個'字典'?一個'列表'?還有別的嗎?當你說你「看到空的收藏」時,你會得到什麼_exactly_? (請生成html)。 –
類型是字典,我得到「defaultdict(<函數rec_dd在0x7fc95115ec08>,{})」 –
你可以嘗試在你的視圖中手動構建的'dict':'data = {1:{「Monday」 2,「星期二:2」,2:{「星期一」:5,「星期二」:7}}??在模板中顯示「{{data}}」和「{{data.1}}」? –