【发布时间】:2014-08-11 11:33:37
【问题描述】:
Django的模板遇到了一个奇怪的问题,而且我什至不知道如何调试模板......
问题:list 类型的变量在传递到模板时不知何故不再是 list。
在我看来,我有一堆变量传递给模板,它们是一个列表字典。这是代码,
查看
project_image_design = {}
for p in projects:
project_image_design[p.id] = []
images = UploadedImage.objects.filter(project=p, image_type=UploadedImage.DESIGN)
for i in images:
project_image_design[p.id].append(i)
这是上下文。我有项目,每个项目都包含图像。我创建了一个字典,其中键是项目 ID,值是与该项目关联的图像列表。
但是,当我在模板中使用它时,事情就出错了,
模板
{% for p in projects %}
<div class="row">
{% for list in project_image_design|get_item:p.id %}
{% for i in list %}
<div class="col-md-2"><img src = "{% get_static_prefix %}media/{{ i.filename }}"></div>
{% endfor %}
{% endfor %}
</div>
{% endfor %}
所以在模板中,我正在遍历项目,然后使用项目的 id (p.id) 来获取字典值,这是一个图像列表,然后遍历它。花哨的get_item 标签只是一种通过键访问字典值的方法,而不是直接变量(请参阅:Django template how to look up a dictionary value with a variable)。
无论如何,我得到这个错误:
TypeError at /designer/my_projects/
'UploadedImage' object is not iterable
错误发生在这一行:{% for i in list %},这是我使用项目 ID 检索的图像列表迭代的行。
这是怎么回事???
我在视图中通过 pdb 进行了双重检查,一切都检查出来了。传递的变量确实是一个列表字典,我在所有单独的字典元素上放了一个type,它们都是列表(例如:type(project_image_design[1]) 将返回<class 'list'>)。
另外,目前,所有列表的长度都是 1。我想知道模板类型是否会压缩大小为 1 的列表?这似乎是一件很奇怪的事情,可能不是原因。
任何帮助将不胜感激。
另外,如何像调试 Python 代码一样调试模板?比如穿越之类的?这甚至可能吗?
【问题讨论】: