2017-10-05 48 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

感谢您的解释 –