You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:46