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)
验证修复
- 进入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为空的分类,重新保存该对象即可自动生成。
- 重启Django开发服务器,点击分类标签,查看URL是否变为实际分类的slug(如
/store/electronics/),确认页面正常加载。
内容的提问来源于stack exchange,提问作者gotnotime
相关产品推荐
相关产品推荐

