Django Jinja模板中用变量索引动态访问列表项报错求助
Django模板中通过变量索引访问列表元素的问题
问题场景
我要做一个展示用户信息的页面,需要显示用户名、密码和用户角色。角色以数字存储,希望通过预定义列表将数字转换为对应角色名称。
我将角色名称硬编码为列表roles = ['admin', 'teacher', 'student'],作为上下文参数传递到HTML模板,同时传入用于访问列表项的变量num(当前为硬编码值,后续会动态修改)。
views.py代码
def index(request): roles = ['admin', 'teacher', 'student'] num=1 return render(request=request, template_name='show_all.html', context={'roles': roles, 'num': num})
模板尝试(show_all.html)
我尝试用num变量访问列表:
{{roles[num]}}
但触发如下错误:
TemplateSyntaxError at /show_all
Could not parse the remainder: '[num]' from 'roles[num]'
我知道roles.0可获取第一个元素,roles.1可获取下一个,但不想硬编码索引。还试过以下写法,均未得到预期结果:
{{roles.num}}
{{roles.get(num)}}
{{roles[num]}}
环境依赖(requirements.txt)
asgiref==3.5.2 Django==4.1.3 sqlparse==0.4.3 tzdata==2022.6
解决方案
Django模板语言不支持直接用变量作为索引访问列表,可通过以下方法解决:
方法1:视图层提前计算角色名称
直接在视图中算出对应角色名称,再传递到模板:
def index(request): roles = ['admin', 'teacher', 'student'] num=1 role_name = roles[num] # 提前计算好角色名称 return render(request=request, template_name='show_all.html', context={'role_name': role_name})
模板中直接使用:
{{role_name}}
方法2:自定义模板过滤器
- 在你的app目录下创建
templatetags文件夹,新建__init__.py和custom_filters.py文件:
# custom_filters.py from django import template register = template.Library() @register.filter def get_item(list_data, index): try: return list_data[index] except (IndexError, TypeError): return ''
- 在模板中加载并使用过滤器:
{% load custom_filters %} {{ roles|get_item:num }}
方法3:利用切片和with标签(Django 3.2+)
无需自定义过滤器,通过切片取目标元素:
{% with role_index=num %} {{ roles|slice:":role_index"|last }} {% endwith %}
此方法通过切片获取num索引前的所有元素,再取最后一个,效果等同于roles[num]。
内容的提问来源于stack exchange,提问作者Harikrishnan.A.S -
相关产品推荐
相关产品推荐

