Django模板中使用for循环访问列表内多个字典的问题
解决Django模板中循环访问列表字典的问题
嘿,我懂你遇到的问题啦!你循环里的{{ dictdata.x.name }}没法正常获取内容,核心原因是Django模板的点语法不支持用变量作为列表索引。
为什么会这样?
你在循环外写的{{ dictdata.0.name }}能正常运行,是因为这里的0是字面量,Django模板会自动把它解析成列表的索引值。但循环里的x是一个变量,模板会把它当成字符串去查找dictdata的键(而不是索引),自然找不到对应的内容啦。
最简单的解决方案:直接遍历列表元素
既然dictdata是包含字典的列表,你完全可以直接循环这个列表,不用绕弯子用range。修改后的模板代码如下:
{% if dictdata %} {% for item in dictdata %} {{ "in loop" }} {{ item.name }} {% endfor %} {{ dictdata.0.name }} {{ dictdata.1.name }} {% endif %}
这样循环里的item就是列表里的每一个字典,直接用item.name就能拿到你要的内容,既简洁又不容易出错。
如果确实需要使用索引(比如要用到循环序号)
要是你必须获取当前元素的索引值,可以用Django模板自带的forloop变量:
forloop.counter:从1开始的循环序号forloop.counter0:从0开始的循环序号
示例代码:
{% if dictdata %} {% for item in dictdata %} {{ "in loop" }} 第{{ forloop.counter0 }}项:{{ item.name }} {% endfor %} {% endif %}
极端情况:一定要用range循环的处理方式
如果因为某些特殊需求必须用range循环,那你需要自定义一个模板过滤器来实现通过索引获取列表元素的功能:
- 在你的Django app下创建
templatetags目录(记得加__init__.py文件),然后新建custom_tags.py:
from django import template register = template.Library() @register.filter def get_item(lst, index): try: return lst[int(index)] except (IndexError, ValueError): return None
- 在模板里加载这个过滤器并使用:
{% load custom_tags %} {% if dictdata %} {% for x in range %} {% with item=dictdata|get_item:x %} {% if item %} {{ "in loop" }} {{ item.name }} {% endif %} {% endwith %} {% endfor %} {% endif %}
不过还是强烈推荐第一种直接遍历列表的方法,这是Django模板处理列表最常规也最优雅的方式~
内容的提问来源于stack exchange,提问作者Deependra Singh
相关产品推荐
相关产品推荐

