Django网站访问/cafelist/1出现DoesNotExist错误求助
解决Django中
Cafe matching query does not exist的错误 你遇到的DoesNotExist at /cafelist/1 Cafe matching query does not exist错误,核心原因很明确:当你访问/cafelist/1时,Django尝试从数据库中获取主键为1的Cafe对象,但你的数据库里根本没有这条数据。下面是一步步的解决思路和修复方案:
1. 先确认数据库中是否有Cafe数据
首先得搞清楚你的数据库里到底有没有Cafe记录:
- 用Django Admin查看:启动项目后访问
/admin/,登录后找到Cafe模型,看看里面有没有数据。如果是空的,直接在后台添加几条测试数据即可。 - 用Django Shell验证:在终端运行
python manage.py shell,然后依次输入:
如果输出是from main.models import Cafe # 查看所有Cafe记录 print(Cafe.objects.all())<QuerySet []>,说明数据库里确实没有任何Cafe数据,这就是报错的直接原因。
2. 给视图添加异常处理,避免粗暴报错
你当前的cafedetails视图用了Cafe.objects.get(pk=pk),这个方法在找不到对象时会直接抛出DoesNotExist异常,导致页面崩溃。更友好的做法是用Django提供的get_object_or_404,它会在找不到对象时返回标准的404页面:
修改views.py中的cafedetails函数:
from django.shortcuts import render, get_object_or_404 # 新增get_object_or_404导入 from .models import Cafe def cafedetails(request, pk): # 替换原来的get()方法 cafeobj = get_object_or_404(Cafe, pk=pk) return render(request, 'main/cafedetails.html', {'cafeobj': cafeobj})
3. 修复cafelist.html中的跳转逻辑错误
你现在的<tr onclick="{% url 'cafedetails' list.id %}">写法是无效的,onclick属性需要JavaScript代码来实现页面跳转,正确写法应该是:
<tr onclick="window.location='{% url 'cafedetails' list.id %}'"> <td>{{ list.name }}</td> <td>{{ list.content }}</td> </tr>
或者更符合HTML规范的方式,给表格内容添加<a>标签:
<tr> <td><a href="{% url 'cafedetails' list.id %}">{{ list.name }}</a></td> <td><a href="{% url 'cafedetails' list.id %}">{{ list.content }}</a></td> </tr>
4. 确保数据库迁移已执行
如果是刚创建Cafe模型,别忘了执行数据库迁移命令,创建对应的数据库表:
在终端依次运行:
python manage.py makemigrations python manage.py migrate
执行完之后,你才能在Django Admin中添加Cafe数据。
内容的提问来源于stack exchange,提问作者박종준
相关产品推荐
相关产品推荐

