Django模板中使用外部变量遍历字典的语法问题
解决Django模板中动态遍历字典键的问题
嘿,我完全懂你碰到的这个麻烦!Django模板的语法在处理动态字典键的时候确实有个容易踩的坑,而且你原来的循环写法也有个小问题,咱们一步步来解决:
首先纠正循环的对象
你定义的keydict={'keys':keys},如果直接写{% for val in keydict %},模板会遍历keydict的键集合,也就是只会循环一次,val的值是'keys',这显然不是你想要的。你需要遍历的是keydict里的keys列表,所以循环应该改成:
{% for key in keydict.keys %}
这样才能拿到你定义的['firstkey', 'secondkey']里的每个键。
核心问题:动态字典键的取值
接下来就是你遇到的关键问题:{{ exampledict.val }}这种写法在模板里是无效的——Django会把它解析成取exampledict['val'],而不是用变量val(或者这里的key)的值作为键去取值。解决这个问题有两种常用方案:
方案1:自定义模板过滤器(通用推荐)
如果你的项目里经常需要动态获取字典的值,自定义一个模板过滤器是最通用的做法:
- 在你的Django app下创建
templatetags目录(如果没有的话),里面新建一个custom_tags.py文件,内容如下:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): # 用get方法避免键不存在时报错,返回空字符串可以根据需求调整 return dictionary.get(key, '')
- 在需要使用的模板顶部加载这个自定义标签:
{% load custom_tags %}
- 然后在循环里就可以这样取值了:
<tr> {% for key in keydict.keys %} <td>{{ exampledict|get_item:key }}</td> {% endfor %} </tr>
方案2:视图层预处理数据(简单直接)
如果只是这个场景需要,你可以在视图里提前把需要的值整理成列表,直接传给模板,这样模板里就不用处理字典的动态取值了:
在视图函数里:
exampledict = {'firstkey': firstval, 'secondkey': secondval} keys = ['firstkey', 'secondkey'] # 按keys的顺序提取对应的值 values_list = [exampledict[key] for key in keys] # 把values_list传给模板 context = {'values_list': values_list} return render(request, 'your_template.html', context)
然后模板里直接遍历这个列表:
<tr> {% for val in values_list %} <td>{{ val }}</td> {% endfor %} </tr>
这样既符合DRY原则,又避免了模板里的复杂逻辑,非常适合一次性的场景。
内容的提问来源于stack exchange,提问作者Marcus Grass
相关产品推荐
相关产品推荐

