Django博客项目问题:存在博客但访问blog/1仍返回404错误
排查步骤与解决方案
看起来你遇到了Django URL路由的典型问题——明明预期能匹配的路径却返回404。咱们一步步拆解排查:
1. 先补全并修正根目录urls.py的路由配置
你当前的根urls.py代码没写完,这是路由的入口,必须确保正确包含blog应用的路由规则。修改后的代码应该是这样:
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), # 关键:把所有blog/开头的请求转发给blog应用的路由处理 path('blog/', include('blog.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
如果之前你写的是path('', ...)而没有指定blog/前缀,那访问blog/1自然找不到匹配的路由。
2. 检查blog应用的urls.py(核心环节!)
你需要在blog应用目录下创建urls.py(如果还没有的话),并定义带主键参数的路由规则:
from django.urls import path from . import views urlpatterns = [ # 匹配blog/1、blog/2这类路径,<int:pk>是Django的路径转换器,会把URL里的数字转成整数参数 path('<int:pk>/', views.blog_detail, name='blog_detail'), # 可选:添加博客列表页路由 # path('', views.blog_list, name='blog_list'), ]
这里的<int:pk>是关键,它告诉Django提取URL中的整数部分作为pk参数传递给视图函数。
3. 确认视图函数正确处理参数
你的blog/views.py中的详情视图需要正确接收pk参数,并在博客不存在时返回404:
from django.shortcuts import render, get_object_or_404 from .models import Blog # 假设你的博客模型是Blog def blog_detail(request, pk): # 用get_object_or_404可以自动在对象不存在时返回404,比手动try-except更简洁 blog = get_object_or_404(Blog, pk=pk) return render(request, 'blog/blog_detail.html', {'blog': blog})
如果视图没有接收pk参数,或者查询条件错误(比如误用了其他字段而非pk),也会导致无法返回正确内容。
4. 验证数据库中是否存在pk=1的博客
有时候我们误以为有数据,但实际数据库里并没有。可以通过两种方式验证:
- 访问
/admin/,进入Blog模型管理页面查看是否有第一条数据; - 在终端运行
python manage.py shell,执行以下代码:
from blog.models import Blog # 返回True说明存在,False说明需要先创建测试数据 Blog.objects.filter(pk=1).exists()
如果返回False,那访问blog/1返回404是正常的,需要先添加测试博客。
5. 检查路由顺序是否冲突
Django的路由是从上到下匹配的,如果根urls.py里有其他和blog/前缀冲突的路径,会优先匹配前面的。确保path('blog/', include('blog.urls'))放在其他可能冲突的路由前面。
按照上面的步骤逐一排查,应该就能解决访问blog/1返回404的问题啦!
内容的提问来源于stack exchange,提问作者user9614630
相关产品推荐
相关产品推荐

