Django中render方法传入query_set时context类型错误导致数据无法展示
解决Django上下文传参错误及数据展示问题
问题场景
从数据库获取到Book数据后无法在页面展示,调试时出现context must be a dict rather than set错误,尝试将QuerySet转为字典后又触发unhashable type: 'list'错误。
相关代码
views.py
from books.models import Book from django.shortcuts import render def query(request): query_set = Book.objects.all() return render(request, 'books.html', {'books', query_set})
books.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>Mostafa Saleh</h1> <p>first Django web application!</p> <ul> {% for book in books %} <li> {{ book.name }}</li> {% endfor %} </ul> </body> </html>
报错信息
第一次报错:
TypeError at / context must be a dict rather than set. Request Method: GET Request URL: http://127.0.0.1:8000/ Django Version: 4.2.5 Exception Type: TypeError Exception Value: context must be a dict rather than set.
尝试转字典后报错:
unhashable type: 'list' Request Method: GET Request URL: http://127.0.0.1:8000/ Django Version: 4.2.5 Exception Type: TypeError Exception Value: unhashable type: 'list'
解决方案
核心错误修正
问题出在render函数的上下文参数上:你用了{'books', query_set},这是Python的集合(set)语法,而Django要求上下文必须是字典(dict)(键值对形式)。只需将集合改为字典即可:
修改后的views.py代码:
from books.models import Book from django.shortcuts import render def query(request): query_set = Book.objects.all() # 将集合符号改为字典的键值对形式 return render(request, 'books.html', {'books': query_set})
额外说明
- 无需将QuerySet转为字典或列表:Django模板支持直接遍历QuerySet对象,
{% for book in books %}的写法本身是正确的。 - 之前尝试转字典的操作完全多余,错误的转换方式反而引发了新报错。
修改完成后重启服务、刷新页面,即可正常遍历展示数据库中的Book数据。
内容的提问来源于stack exchange,提问作者Mostafa Saleh
相关产品推荐
相关产品推荐

