【问题标题】:Django template lists not iterable?Django模板列表不可迭代?
【发布时间】: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]) 将返回&lt;class 'list'&gt;)。

另外,目前,所有列表的长度都是 1。我想知道模板类型是否会压缩大小为 1 的列表?这似乎是一件很奇怪的事情,可能不是原因。

任何帮助将不胜感激。

另外,如何像调试 Python 代码一样调试模板?比如穿越之类的?这甚至可能吗?

【问题讨论】:

    标签: django list templates


    【解决方案1】:

    它并没有停止成为一个列表。但是您有两个嵌套的 for 循环:您遍历从字典中获取的项目 - 混淆地调用每个项目 list - 然后尝试再次遍历该“列表”中的项目。但是内部循环没有意义:你应该做的很简单:

    {% for i in project_image_design|get_item:p.id %}
        <div class="col-md-2"><img src = "{% get_static_prefix %}media/{{ i.filename }}"></div>
    {% endfor %}
    

    我还要指出您的视图逻辑过于复杂。它可以简化为:

    for p in projects:    
        project_image_design[p.id] = UploadedImage.objects.filter(project=p, image_type=UploadedImage.DESIGN)
    

    事实上,它可以进一步简化:你根本不需要字典或 get_item 标签。相反,在 Project 上提供一个名为 design_images 的方法,它只返回该类型的图像:

    def design_images(self):
        return self.uploadedimage_set.filter(image_type=UploadedImage.DESIGN)
    

    并从视图中完全删除字典逻辑,现在您的模板可以是:

    {% for p in projects %}
        <div class="row">
    
            {% for i in p.design_images %}
                <div class="col-md-2"><img src = "{% get_static_prefix %}media/{{ i.filename }}"></div>
            {% endfor %}
        </div>
    {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2014-08-19
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2015-10-16
      • 2013-12-16
      • 2021-12-09
      相关资源
      最近更新 更多