Django模板中如何使用变量调用列表或字典元素?
解决Django模板中用变量作为键/索引访问字典/列表的问题
嘿,我完全懂你这个痛点!Django模板的**点语法(.)**和Python原生的取值逻辑不一样,它没法直接像exampledict[key]那样用变量作为键去取字典或者列表的值——这也是很多刚用Django模板的开发者容易踩的坑。下面给你几个实用的解决方案:
方法1:用Django内置的lookup过滤器(Django 1.11+适用)
从Django 1.11版本开始,官方已经内置了专门解决这个问题的lookup过滤器,用法超简单。假设你已经把keylist和exampledict传到模板里了,直接这么写就行:
{% for key in keylist %} {{ exampledict|lookup:key }} {% endfor %}
这样就能完美输出你想要的firstval、secondval、thirdval了。要是你想访问列表的索引,比如有个列表mylist和变量index,同样可以用{{ mylist|lookup:index }}来取对应位置的元素。
方法2:自定义模板过滤器(兼容旧版Django)
如果你的Django版本还停留在1.11之前,或者需要更定制化的逻辑(比如加默认值),自己写个模板过滤器也很简单:
- 先在你的app里建一个
templatetags文件夹(别忘了加空的__init__.py文件,不然Django识别不到),然后新建一个custom_filters.py文件,内容如下:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): # 这里可以设置默认值,避免键不存在时页面报错 return dictionary.get(key, '')
- 在需要用的模板开头加载这个过滤器:
{% load custom_filters %}
- 之后就可以像这样使用了:
{% for key in keylist %} {{ exampledict|get_item:key }} {% endfor %}
方法3:视图层提前预处理数据(简单场景首选)
如果你的需求不复杂,其实也可以偷懒——直接在视图里把需要的结果提前处理好,再传给模板。比如:
def my_view(request): keylist = ['firstkey', 'secondkey', 'thirdkey'] exampledict = {'firstkey':'firstval', 'secondkey':'secondval', 'thirdkey':'thirdval'} # 直接把需要的值整理成列表 value_list = [exampledict[key] for key in keylist] return render(request, 'my_template.html', {'value_list': value_list})
然后在模板里直接循环这个预处理好的列表就行:
{% for val in value_list %} {{ val }} {% endfor %}
为啥直接写{{ exampledict.key }}不行?
最后跟你解释下原因:Django模板的点语法是按这个顺序查找的:
- 对象的属性(比如
obj.key) - 对象的无参方法
- 字典的固定字符串键(也就是它会去找键为
'key'的值,而不是变量key对应的那个键) - 列表/元组的数字索引
所以你之前写的{{ exampledict.key }},其实是在找字典里键叫'key'的内容,而不是变量key的值对应的键——这就是为啥没得到预期结果的原因啦。
内容的提问来源于stack exchange,提问作者Marcus Grass
相关产品推荐
相关产品推荐

