如何在HTML模板中对Python字典new_headers进行索引取值?
Django模板中获取字典值的实现方案
静态键直接访问
在Django模板里,针对字典类型变量,你可以用.操作符直接访问对应键的值,比如要获取new_headers中键为190的值:
{{ new_headers.190 }}
如果担心键不存在引发异常,可结合default过滤器设置默认值:
{{ new_headers.get.190|default:0 }}
动态键访问(适配遍历场景)
如果需要用变量作为键(比如遍历文件夹时用foldr.id作为索引),需要自定义模板过滤器:
- 在你的Django应用下创建
templatetags目录,新增__init__.py和custom_filters.py文件 - 在
custom_filters.py中编写过滤器代码:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): return dictionary.get(key, 0) # 键不存在时返回默认值0
- 在模板顶部加载过滤器:
{% load custom_filters %}
- 模板中使用方式:
{% for foldr in my_folders %} 文件夹{{ foldr.name }}的条目数:{{ new_headers|get_item:foldr.id }} {% endfor %}
性能优化方案:避免模板索引,直接关联数据到模型对象
原视图存在N+1查询问题(每个文件夹都执行一次count查询),可以通过数据库注解优化,同时让模板代码更简洁:
修改视图代码:
from django.db.models import Count def send_template(request): # 用annotate在数据库层面一次性统计每个文件夹的条目数 my_folders = Folders.objects.filter(parent=None).order_by('name').annotate(entry_count=Count('folderentries')) return render(request, 'folders.html', {'my_folders': my_folders})
模板中直接访问对象属性:
{% for foldr in my_folders %} 文件夹{{ foldr.name }}的条目数:{{ foldr.entry_count }} {% endfor %}
这种方式既提升了查询性能,又无需在模板中处理字典索引,代码更易维护。
内容的提问来源于stack exchange,提问作者er abhi
相关产品推荐
相关产品推荐

