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
相关产品推荐
相关产品推荐

