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

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:自定义模板过滤器

  1. 在你的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 ''
  1. 在模板中加载并使用过滤器:
{% 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 -

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:05:46