Django访问/blog/blogpost路径报404 Page not found错误
Django访问/blog/blogpost返回404问题修复
问题现象
- 完成博客模块路由、视图、模型代码编写后,访问
/blog/blogpost触发404 Page not found错误 - 服务端日志输出:
Not Found: /blog/blogpost [21/Jun/2022 12:29:33] "GET /blog/blogpost HTTP/1.1" 404 2678
- 报错页面截图:

现有代码
路由配置(Urls.py)
urlpatterns = [ path("", views.index, name="blogHome"), path("blogpost/<int:id>/", views.blogpost, name="blogHome") ]
视图代码(Views.py)
django.shortcuts import render from .models import Blogpost # Create your views here. def index(request): return render(request, 'blog/index.html') def blogpost(request, id): post.Blogpost.objects.filter(post_id = id)[0] print(post) return render(request, 'blog/blogpost.html')
模型代码(Models.py)
from django.db import models class Blogpost(models.Model): post_id = models.AutoField(primary_key=True) title = models.CharField(max_length=50) head0 = models.CharField(max_length=500, default="") chead0 = models.CharField(max_length=10000, default="") head1 = models.CharField(max_length=500, default="") chead1 = models.CharField(max_length=10000, default="") head2 = models.CharField(max_length=500, default="") chead2 = models.CharField(max_length=10000, default="") pub_date = models.DateField() thumbnail = models.ImageField(upload_to='blog/images', default="") def __str__(self): return self.title
问题根因
- 路由不匹配:当前配置的
blogpost路由强制要求传入整数类型的id路径参数,且路径末尾带斜杠,合法匹配格式为/blog/blogpost/<整数id>/,直接访问无参数的/blog/blogpost没有对应路由规则,直接返回404。 - 代码存在多处运行时错误,即便路由匹配成功也无法正常响应:
- 视图文件第一行缺少
from关键字,导入render的写法错误 - 查询博客对象的语句没有赋值给
post变量,直接写post.Blogpost.objects.filter(...)会抛出变量未定义、类调用方式错误的异常 - 两个路由的
name参数重复定义为blogHome,后续反向解析路由会出现冲突 - 直接用下标
[0]取filter查询结果,当对应id的文章不存在时会触发索引越界异常
- 视图文件第一行缺少
修复步骤
- 修正路由配置:
两个路由不要使用重复的name值,如果需要访问博客详情页,访问路径必须携带对应文章id,例如访问id为1的文章地址为/blog/blogpost/1/。如果需要兼容不带斜杠、不带id的访问逻辑,可以新增对应路由规则,参考配置:
urlpatterns = [ path("", views.index, name="blogHome"), path("blogpost/<int:id>/", views.blogpost, name="blogPost"), ]
- 修复视图层代码:
# 补全正确的导入语句 from django.shortcuts import render, get_object_or_404 from .models import Blogpost def index(request): return render(request, 'blog/index.html') def blogpost(request, id): # 修正变量赋值,用get_object_or_404自动处理文章不存在的404逻辑 post = get_object_or_404(Blogpost, post_id=id) print(post) # 将查询到的文章对象传入模板上下文 return render(request, 'blog/blogpost.html', {"post": post})
- 重启Django服务后,携带合法文章id访问对应路径即可正常加载页面。
内容的提问来源于stack exchange,提问作者user19380298
相关产品推荐
相关产品推荐

