Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django模板中使用集合_Python_Django_Django Templates - Fatal编程技术网

Python 如何在Django模板中使用集合

Python 如何在Django模板中使用集合,python,django,django-templates,Python,Django,Django Templates,我有这样的收藏: data[1]['Monday'] = 2 data[1]['Tuesday'] = 2 data[2]['Monday'] = 5 data[2]['Tuesday'] = 7 并希望在django模板中使用它。 当我这样做的时候: {{ data}} 一切都显示正确。但如果我尝试,例如: {{data.1}} 然后我看到空的集合。 有人知道为什么吗 提前感谢,TL;DR:如果你喜欢自己的心理健康,请避免将defaultdict传递给Django模板;) 好吧,OP找到了

我有这样的收藏:

data[1]['Monday'] = 2
data[1]['Tuesday'] = 2
data[2]['Monday'] = 5
data[2]['Tuesday'] = 7
并希望在django模板中使用它。 当我这样做的时候:

{{ data}}
一切都显示正确。但如果我尝试,例如: {{data.1}}

然后我看到空的集合。 有人知道为什么吗


提前感谢,

TL;DR:如果你喜欢自己的心理健康,请避免将defaultdict传递给Django模板;)

好吧,OP找到了一个解决办法,这样做让我明白了问题的真正所在,所以我想我无论如何都会发布这个答案,因为一旦你明白了行为会让你放松时间和头发,这是很明显的

这里的问题是Django模板如何查找值和
defaultdict
如何工作的组合。为了解析
{{data.1}}
,Django不知道
1
应该是一个int(
1
)还是一个字符串(
u“1”
),所以它首先调用
数据。
使用字符串
u“1”
,然后-如果调用引发了
KeyError
-使用int
1
。这可以通过以下代码(py2.7.x、django 1.10.x)看到:


现在,由于OP使用带有int键的defaultdict,Django首先尝试使用字符串,defaultdict将为(缺少的)
u“1”
键创建一个新条目,并返回默认值(在本例中为空dict)。

TL;DR:如果你喜欢自己的心理健康,请避免将defaultdict传递给Django模板;)

好吧,OP找到了一个解决办法,这样做让我明白了问题的真正所在,所以我想我无论如何都会发布这个答案,因为一旦你明白了行为会让你放松时间和头发,这是很明显的

这里的问题是Django模板如何查找值和
defaultdict
如何工作的组合。为了解析
{{data.1}}
,Django不知道
1
应该是一个int(
1
)还是一个字符串(
u“1”
),所以它首先调用
数据。
使用字符串
u“1”
,然后-如果调用引发了
KeyError
-使用int
1
。这可以通过以下代码(py2.7.x、django 1.10.x)看到:


现在,由于OP使用带有int键的defaultdict,Django首先尝试使用字符串,defaultdict将为(缺少的)
u“1”
键创建一个新条目,并返回默认值(在本例中为空dict)。

什么类型是
数据
?a
dict
列表
?还有别的吗?当你说“看到空的收藏”时,你到底得到了什么?(请生成html)。类型是dict,我得到“defaultdict(,{})”您可以尝试使用
dict
在您的视图中手动构建:
data={1:{“周一”:2,“周二:2},2:{“周一”:5,“周二”:7}
,并且在您的模板中同时显示
{data}
{data.1}
?我发现问题-模板没有显示数据,因为有数字而不是字符串。当我将例如数据[2]['Tuesday']=7更改为数据['2']['Tuesday']=7则一切正常。感谢更安全的解决方案是避免将
defaultdict
传递给模板,参见我的答案。什么类型的
数据
?a
dict
?a
列表
?其他?当您说“查看空集合”时,您得到的确切信息是什么?(请生成html).Type是dict,我得到的是“defaultdict(,{})”您可以尝试使用
dict
在视图中手动生成:
data={1:{“星期一”:2,“星期二:2},2:{“星期一”:5,“星期二”:7}
?在您的模板显示中,
{{data}}
{{data.1}}
?我发现了问题-模板没有显示数据,因为是数字而不是字符串。当我将数据[2][周二]=7更改为数据[2][周二]=7时,一切都正常。感谢更安全的解决方案是避免将
defaultdict
传递给模板,参见我的答案。
>>> 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 ''"
>>> 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})
>>>