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

如何在Django中创建包含分类与子分类的详情页面路径

嘿,我来帮你搞定这个Django详情页路径的问题!要实现localhost/[分类slug]/[子分类slug]/[文章标识]/(对应你的detail_page.html模板)这种带层级的URL结构,咱们得从URL配置、视图函数和模板链接这三个核心部分调整,一步步来:

1. 配置URL模式(urls.py)

首先要在你的应用URL配置里定义包含分类slug、子分类slug和文章标识的路径,替换原来简单的detail_page.html路径。假设你的应用叫blog,示例代码如下:

# blog/urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他URL...
    # 这里用文章ID作为标识,也可以换成文章slug,根据你的需求调整
    path('<slug:category_slug>/<slug:subcategory_slug>/<int:post_id>/', views.post_detail, name='post_detail'),
]

这里的<slug:category_slug>和<slug:subcategory_slug>会捕获URL中的分类和子分类slug,传递给视图函数;<int:post_id>是文章的唯一标识(如果用文章slug的话,改成<slug:post_slug>即可)。

2. 调整视图函数(views.py)

视图需要接收URL传递的三个参数,并且要验证文章确实属于对应的子分类和分类,避免用户手动输入错误的slug访问到不属于该层级的文章。示例代码:

# blog/views.py
from django.shortcuts import get_object_or_404, render
from .models import Category, Subcategory, Post

def post_detail(request, category_slug, subcategory_slug, post_id):
    # 先获取对应的分类和子分类,确保两者关联正确
    category = get_object_or_404(Category, slug=category_slug)
    subcategory = get_object_or_404(Subcategory, slug=subcategory_slug, category=category)
    # 获取该子分类下的目标文章
    post = get_object_or_404(Post, id=post_id, subcategory=subcategory)
    
    # 将数据传递给模板
    return render(request, 'detail_page.html', {
        'post': post,
        'current_category': category,
        'current_subcategory': subcategory
    })
3. 修改模板中的链接(index.html或文章列表页)

在展示文章列表的模板里,要用Django的{% url %}模板标签生成正确的URL,传入对应的参数。比如:

<!-- index.html 中的文章列表示例 -->
{% for post in posts %}
    <div class="post-item">
        <h3>
            <a href="{% url 'post_detail' 
                category_slug=post.subcategory.category.slug 
                subcategory_slug=post.subcategory.slug 
                post_id=post.id %}">
                {{ post.title }}
            </a>
        </h3>
        <p>{{ post.excerpt }}</p>
    </div>
{% endfor %}

注意:这里依赖你模型之间的外键关联是正确的,比如Post关联Subcategory,Subcategory关联Category。如果你的模型还没设置好关联,参考下面的模型示例:

# blog/models.py 关联示例
from django.db import models
from django.utils.text import slugify

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True, blank=True)
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

class Subcategory(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='subcategories')
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE, related_name='posts')
    # 其他字段:发布时间、作者等
    
    def save(self, *args, **kwargs):
        # 如果用文章slug的话,这里可以生成slug
        # if not self.slug:
        #     self.slug = slugify(self.title)
        super().save(*args, **kwargs)
最后测试

启动Django开发服务器,点击列表页的文章链接,就能看到URL变成http://localhost:8000/your-category-slug/your-subcategory-slug/1/这种结构,完美匹配你想要的路径!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:20:20