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
相关产品推荐
相关产品推荐

