Django模板遍历分组嵌套字典时gbv[item]语法报错如何解决?
问题原因
Django 模板系统不支持 Python 原生的方括号[]下标取值语法,不管是取字典值、列表元素还是对象属性,统一使用点号.进行访问。你写的gbv[item]属于Python原生语法,不符合Django模板规则,因此触发语法报错。
解决方案
最简便的写法是直接遍历字典的items键值对,不需要单独通过key取value,模板代码修改如下:
{% block content %} {% for tag, task_list in gbv.items %} - {{ tag }}: {% for task in task_list %} -- {{ task.name }} {% endfor %} {% endfor %} {% endblock content %}
渲染后就会完全符合你需要的展示格式。
视图代码优化建议
你当前的视图写法存在N+1查询性能问题:如果有N个不同的tag,会执行1次查询去重tag + N次查询对应tag的任务,数据量大时性能很差,可以用itertools.groupby优化为单次数据库查询:
from itertools import groupby def bytag(request): # groupby要求同组元素连续,因此先按tag字段排序 all_tasks = Task.objects.order_by('tag').all() # 按tag分组生成字典 group_by_value = {tag: list(tasks) for tag, tasks in groupby(all_tasks, key=lambda x: x.tag)} context = {'gbv': group_by_value} return render(request,'tasks/bytag.html', context)
内容的提问来源于stack exchange,提问作者Rishi
相关产品推荐
相关产品推荐

