Django模板中如何通过索引从列表获取元素?
问题解决:Django模板中变量作为索引无法生效的处理方案
问题原因
在Django模板语法里,model.get_fields.counter会被直接解析为获取model.get_fields里名为"counter"的属性/键,而不是把counter变量的数值当作索引去取值——这就是你手动输入数字能生效,但用变量就不行的核心原因。
解决方案
方案1:自定义模板过滤器(推荐)
通过自定义过滤器实现“用变量作为索引取值”的功能:
- 在你的Django应用目录下创建
templatetags文件夹(没有的话新建),里面创建__init__.py和custom_filters.py两个文件。 - 在
custom_filters.py中写入以下代码:
from django import template register = template.Library() @register.filter def get_item(obj, key): try: return obj[key] except (KeyError, IndexError, TypeError): return ''
- 在需要使用的模板顶部加载过滤器:
{% load custom_filters %}
- 修改原代码,用过滤器实现变量索引:
{% for question in model.get_questions %} {% with counter=forloop.counter %} {{ question }} {{ model.get_fields|get_item:counter }} <br> {% endwith %} {% endfor %}
方案2:视图层预处理配对数据
如果不想写过滤器,可以在视图里把问题和对应的字段提前配对好,再传给模板:
比如在视图函数中:
# 注意:forloop.counter从1开始,若model.get_fields是0索引的列表,需调整切片匹配索引 question_field_pairs = zip(model.get_questions, model.get_fields[1:]) context = {'question_field_pairs': question_field_pairs}
然后模板里直接遍历配对后的组合:
{% for question, field in question_field_pairs %} {{ question }} {{ field }} <br> {% endfor %}
内容的提问来源于stack exchange,提问作者burak
相关产品推荐
相关产品推荐

