使用get_object_or_404方法时出现Page not found (404)错误求助
问题原因
你访问的URL http://127.0.0.1:8000/blog/1/ 完全不符合定义的post_detail路由规则。当前blog/urls.py里的post_detail路由要求格式为<int:year>/<int:month>/<int:day>/<slug:post>/,需要年、月、日、文章slug四个参数,但你只输入了单个数字1,无法匹配任何已定义路由,因此触发404错误。
解决方案
情况1:需要通过文章ID访问详情页
如果你的需求是用文章ID(如blog/1/中的1)访问详情页,需做以下修改:
- 更新
blog/urls.py,新增匹配ID的路由:
urlpatterns = [ path('', views.PostListView.as_view(), name='post_list'), # 新增按ID访问的路由 path('<int:post_id>/', views.post_detail_by_id, name='post_detail_by_id'), # 保留原有的日期+slug路由(可选,根据需求决定是否保留) path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'), ]
- 在
blog/views.py中添加对应视图函数:
def post_detail_by_id(request, post_id): post = get_object_or_404(Post, status=Post.Status.PUBLISHED, id=post_id) return render(request, 'blog/post/detail.html', {"post": post})
情况2:按定义的日期+slug格式访问(正确的详情页URL)
如果是输错了URL,正确的详情页URL格式应为http://127.0.0.1:8000/blog/2024/10/05/my-first-post/(对应文章的发布年、月、日和slug字段值)。你可以:
- 登录后台管理页面(
/admin/),找到已发布的文章,查看其publish日期和slug值,拼接成正确URL访问; - 若文章列表页(
/blog/)模板中调用了get_absolute_url方法,直接点击列表中的文章链接即可访问。
额外注意
- 若不需要按日期+slug的路由,可直接删除
blog/urls.py中对应的条目,替换为按ID的路由; - 确保目标文章处于已发布状态(
status=Post.Status.PUBLISHED),否则即使URL正确,get_object_or_404也会返回404。
内容的提问来源于stack exchange,提问作者mkg
相关产品推荐
相关产品推荐

