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

Django分类页面404错误求助:点击分类跳转至/store/slug/

问题排查与解决方案

核心原因

点击分类标签后URL变为/store/slug/,说明模板中的分类链接没有正确传递分类的实际slug值,而是直接将URL路径中的占位符字符串"slug"作为了路径参数,导致Django无法找到名为"slug"的分类,触发404错误。

代码逐一排查

1. 检查URL配置(urls.py)

首先确认store应用的urls.py中,分类列表的路径参数名是否正确:

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

urlpatterns = [
    path('', views.product_list, name='product_list'),
    # 注意这里的参数名(如category_slug)要和视图接收的参数一致
    path('<slug:category_slug>/', views.product_list, name='product_list_by_category'),
]

2. 检查视图函数(views.py)

确认视图接收的参数名与URL配置中的参数名匹配,且查询逻辑正确:

# store/views.py
from django.shortcuts import render, get_object_or_404
from .models import Category, Product

def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)
    
    if category_slug:
        # 这里的slug参数要和Category模型的slug字段对应
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)
    
    return render(request, 'store/product_list.html', {
        'category': category,
        'categories': categories,
        'products': products
    })

3. 检查模板链接(product_list.html)

这是最可能出错的地方,必须使用{% url %}标签生成链接,并正确传递分类的slug值:
错误示例(直接硬编码或参数传递错误):

<!-- 错误写法:直接写死路径 -->
<a href="/store/slug/">{{ category.name }}</a>

<!-- 错误写法:参数名不匹配或未传递实际值 -->
<a href="{% url 'product_list_by_category' slug %}">{{ category.name }}</a>

正确写法(根据URL配置的参数名传递category.slug):
如果URL中参数名是category_slug:

<a href="{% url 'product_list_by_category' category_slug=category.slug %}">{{ category.name }}</a>

如果URL中参数名是slug:

<a href="{% url 'product_list_by_category' slug=category.slug %}">{{ category.name }}</a>

4. 检查Category模型的slug字段

确保模型中正确定义了slug字段,且已生成实际的slug值:

# store/models.py
from django.db import models
from django.utils.text import slugify

class Category(models.Model):
    name = models.CharField(max_length=200)
    # 必须设置unique=True,避免重复slug
    slug = models.SlugField(max_length=200, unique=True)

    class Meta:
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    # 自动生成slug(可选,确保新增分类时自动生成)
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

验证修复

  1. 进入Django shell,确认所有分类都有有效的slug值:
python manage.py shell
from store.models import Category
for cat in Category.objects.all():
    print(f"分类:{cat.name},Slug:{cat.slug}")

如果存在slug为空的分类,重新保存该对象即可自动生成。

  1. 重启Django开发服务器,点击分类标签,查看URL是否变为实际分类的slug(如/store/electronics/),确认页面正常加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:05:15