Django模板中如何使用forloop计数器获取字典对应值
问题根因
你的get_item过滤器本身逻辑没有问题,无返回值的核心原因是参数不匹配:你持有的allBudgets是字符串键的字典,键为'2021/2022'、'2022/2023'这类时间字符串,而你传入过滤器的forloop.counter0是0、1类型的整数,用整数索引查询字符串键的字典自然返回空值。
另外注意你标注为Views.py的代码实际是Django模板代码,不要误放到视图层Python文件中。
解决方案
根据你的使用场景选择对应方案即可:
场景1:按循环顺序取对应位置的预算值
如果你的字典键是固定顺序的,只需要按循环索引取对应位置的值,推荐优先在视图层预处理数据:
# views.py 视图层处理 for project in projectList: # Python 3.7+ 版本字典默认保留插入顺序,可直接将值转为列表 project.budget_list = list(project.allBudgets.values())
模板中直接用原有get_item过滤器取值即可:
{% for project in projectList %} <tr> <td><h5>{{ project.id }}</h5></td> <td><h5>${{ project.budget_list|get_item:forloop.counter0 }}</h5></td> </tr> {% endfor %}
如果不想修改视图层代码,也可以新增一个模板过滤器实现字典转值列表:
# Extension.py 新增过滤器 @register.filter def get_dict_values(dictionary): return list(dictionary.values())
模板中组合两个过滤器使用:
{{ project.allBudgets|get_dict_values|get_item:forloop.counter0 }}
场景2:按指定时间键取预算值
如果你不需要按索引取值,而是要取对应时间的预算,直接传入字符串键即可,无需使用forloop.counter0:
{# 示例:取2021/2022年度的预算 #} {{ project.allBudgets|get_item:"2021/2022" }}
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

