Django模板中如何将外层循环变量用于内层循环的取值操作
问题排查与修复方案
根本原因
你之前写的模板代码无法渲染内容,核心是踩了两个Django模板的语法规则坑:
- Django模板的点号取值存在固定查找顺序,当你写
data.key时,模板引擎会真的去查找data对象里字面量叫key的键/属性/数组索引,不会识别到外层循环里的key是个动态变量,自然拿不到对应键的嵌套内容——你的data字典里根本没有名为"key"的顶层键,所以内层循环拿到的是空集合,没有任何内容可以渲染。 - 直接写
{% for key in data %}遍历字典时,只会拿到字典的所有顶层键的字符串值(比如'Google_Suite'、'Language'),没有同步获取每个键对应的嵌套字典值,本身遍历逻辑就缺失了内层循环需要的数据源。
适配你嵌套字典结构的正确代码
你的后端传入的data是三层嵌套结构:顶层大分类→二级子分类→对应课程的QuerySet,逐层级遍历字典的键值对是最省事、不需要额外编写自定义逻辑的实现方式:
{% for top_key, top_value in data.items %} <!-- 第一层遍历:拿到顶层分类名(如Google_Suite)和对应的二级嵌套字典 --> {% for sub_key, sub_value in top_value.items %} <!-- 第二层遍历:拿到二级分类名(如Google Sheet)和对应的课程QuerySet --> {% for course in sub_value %} <div>{{ course }}</div> {% endfor %} {% endfor %} {% endfor %}
注:Django模板引擎原生支持对字典调用
.items()方法遍历键值对,不需要在后端做额外的格式转换,直接传入你现在的嵌套字典结构即可正常渲染。
特殊场景补充
如果遇到必须通过外层循环拿到的变量,作为动态键名去从字典里取值的场景,不要依赖点号直接拼接变量(比如data.外层变量),这种写法一定会被模板引擎当成字面量字符串查找,无法拿到正确值。你可以通过自定义模板过滤器实现动态字典键读取,在模板中通过{{ 目标字典|自定义过滤器:动态键变量 }}的方式取值,绕过点号取值的字面量查找限制。
内容的提问来源于stack exchange,提问作者Nirattasai
相关产品推荐
相关产品推荐

