我有这样的集合:如何使用集合在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}}”? –