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

Django模板循环中如何动态获取criteria列表对应元素?

问题描述

遍历用于生成作业反馈表单的formset时,需添加标签显示作业的评分标准(Criteria),让用户明确评分依据。已将筛选后的Criteria查询集转为列表传入上下文,模板中可通过{{ criteria.0 }}手动获取元素,但尝试用{{ criteria.forloop.counter }}或with标签动态获取时无输出;转为列表后使用criteria[forloop.counter0]又出现解析错误。

视图代码如下:

criteria = Criteria.objects.filter(assignmentID=assignment.id)
criteria_list = list(criteria)

formset = FeedbackFormset(queryset=Feedback.objects.none())
for i, criterion in enumerate(criteria):
    formset.forms[i].fields['criteriaLevelID'].queryset = criterion.criterialevel_set.all()

context = {
    'submission': submission,
    'formset': formset,
    'criteria':criteria_list
}

return render(request, 'markingApp/createFeedback.html', context)
解决方案

Django模板语法不支持criteria[变量]这类动态索引写法,这是criteria[forloop.counter0]报错的核心原因。推荐两种解决方式:

方式一:视图层配对表单与评分标准(更直观)

在视图中将formset的每个表单与对应的评分标准打包,直接传入模板遍历,无需手动处理索引:

修改视图代码

criteria = Criteria.objects.filter(assignmentID=assignment.id)
criteria_list = list(criteria)

formset = FeedbackFormset(queryset=Feedback.objects.none())
for i, criterion in enumerate(criteria):
    formset.forms[i].fields['criteriaLevelID'].queryset = criterion.criterialevel_set.all()

# 打包表单与对应评分标准
form_criteria_pairs = list(zip(formset.forms, criteria_list))

context = {
    'submission': submission,
    'formset': formset,
    'form_criteria_pairs': form_criteria_pairs
}

return render(request, 'markingApp/createFeedback.html', context)

修改模板代码

{% for form, criterion in form_criteria_pairs %}
    <!-- 显示评分标准,替换为你实际的字段名,比如criterion.description -->
    <label class="criteria-label">{{ criterion.name }}</label>
    <!-- 渲染表单 -->
    {{ form.as_p }}
{% endfor %}

方式二:自定义模板过滤器(保留原上下文结构)

如果不想调整视图逻辑,可自定义过滤器实现动态索引:

1. 创建自定义过滤器

在你的app目录下新建templatetags/custom_filters.py:

from django import template

register = template.Library()

@register.filter
def get_item(lst, index):
    try:
        return lst[index]
    except (IndexError, ValueError):
        return None

2. 在模板中使用过滤器

{% load custom_filters %}

{% for form in formset %}
    {% with criterion=criteria|get_item:forloop.counter0 %}
        <label>{{ criterion.name }}</label>
        {{ form.as_p }}
    {% endwith %}
{% endfor %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:15:21