You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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之前,或者需要更定制化的逻辑(比如加默认值),自己写个模板过滤器也很简单:

  1. 先在你的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, '')
  1. 在需要用的模板开头加载这个过滤器:
{% load custom_filters %}
  1. 之后就可以像这样使用了:
{% 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模板的点语法是按这个顺序查找的:

  1. 对象的属性(比如obj.key)
  2. 对象的无参方法
  3. 字典的固定字符串键(也就是它会去找键为'key'的值,而不是变量key对应的那个键)
  4. 列表/元组的数字索引

所以你之前写的{{ exampledict.key }},其实是在找字典里键叫'key'的内容,而不是变量key的值对应的键——这就是为啥没得到预期结果的原因啦。


内容的提问来源于stack exchange,提问作者Marcus Grass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:15:55