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

Django配置博客三级URL路径(/blog/分类ID/文章ID)访问报错求助

问题修复方案

1. 修正 blog/urls.py 配置

你的URL配置存在3个核心错误:

  • 博客详情路径多写了无效的views.category参数,导致视图映射错误
  • 路径重复添加了blog/前缀,和你期望的URL结构不符(默认根URLconf已通过path('blog/', include('blog.urls'))挂载博客应用,若未配置可先在项目根urls.py中添加该规则)
  • 详情路径传入了category_id参数但对应视图没有接收配置,需和后续视图修改同步

修改后代码:

from django.urls import path
from . import views

app_name = "blog"
urlpatterns = [
    # 对应example.com/blog/ 展示全部博客
    path('', views.index, name='index'),
    # 若welcome相关功能不需要可直接删除该行,避免和分类路径冲突
    # path('<int:welcome_id>/', views.welcome_detail, name='welcome_detail'),
    # 对应example.com/blog/category_id/ 展示指定分类下博客
    path('<int:category_id>/', views.category, name="category"),
    # 对应example.com/blog/category_id/post_id/ 展示单篇博客,删除多余的无效参数
    path('<int:category_id>/<int:blog_id>/', views.blog_post_detail, name="blog_detail"),
]

2. 修正 blog/views.py 逻辑

2.1 修复分类页查询错误

你之前用get查询分类下的博客,get只能返回单条数据,分类下有多篇博客时会直接报错,需换成filter,同时补充分类对象查询逻辑:

def category(request, category_id):
    try:
        # 先查询对应分类
        category_obj = Categories.objects.get(pk=category_id)
        # 查询该分类下所有博客
        blogs_of_category = BlogPost.objects.filter(categories=category_id)
    except Categories.DoesNotExist:
        raise Http404("分类不存在")
    return render(request, "blog/category.html", {"category": category_obj, "blogs": blogs_of_category})

2.2 修复博客详情页参数缺失问题

URL传入了category_id和blog_id两个参数,函数需要同步接收,还可以增加校验逻辑避免用户输入非法URL跨分类访问博客:

def blog_post_detail(request, category_id, blog_id):
    try:
        # 校验博客属于对应分类
        blog_post = BlogPost.objects.get(pk=blog_id, categories_id=category_id)
    except BlogPost.DoesNotExist:
        raise Http404("博客不存在")
    return render(request, "blog/blogdetail.html", {"blog": blog_post})

3. 清理 blog/models.py 无效代码

你多个模型方法里引用了不存在的Status对象,这些方法如果不需要直接删除即可,避免后续运行报错:

from django.db import models

class WelcomePage(models.Model):
    greeting_text = models.TextField(max_length=2000)
  
    def __str__(self):
        return self.greeting_text


class Categories(models.Model):
    name = models.CharField(max_length=200)
    category_title = models.CharField(max_length=200, default='')

    def __str__(self):
        return self.name

class BlogPost(models.Model):
    blog_title = models.CharField(max_length=200)
    blog_text = models.TextField(max_length=10000)
    pub_date = models.DateTimeField('date published')
    categories = models.ForeignKey(Categories, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return self.blog_title

内容的提问来源于stack exchange,提问作者sololuvr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:27:04