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

使用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)访问详情页,需做以下修改:

  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'),
]
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:07:16