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

Django商品目录分类展示产品时出现404错误求助

Django商品目录系统分类跳转404问题修复

问题描述

开发基于Django的商品目录系统时,目录板块功能正常,但点击分类项跳转产品详情页出现404错误。具体表现:后台创建分类test及对应产品product1,点击分类项生成的URL为catalog/product/test,返回404;手动修改为catalog/product/product1可正常显示产品详情。

问题根源

  1. 参数不匹配:模板中循环的是分类对象,跳转product-detail时传递的是分类的ID,而product-detail视图是根据slug查找Product对象,分类的标识与产品不匹配,导致找不到对应资源返回404。
  2. 逻辑错误:分类页面的设计目标应该是展示该分类下的所有产品,而非直接从分类跳转到某一个产品详情。

修复步骤

1. 修正视图,传递分类下的产品数据

修改views.py中的CatalogDetailViews,在上下文里添加当前分类对应的产品列表:

class CatalogDetailViews(ListView):
    model = Category
    template_name = 'catalog/catalog-detail.html'
    context_object_name = 'category'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 获取当前目录对象
        current_catalog = get_object_or_404(Catalog, slug__iexact=self.kwargs.get('slug'))
        # 获取该目录下所有分类对应的产品
        context['products'] = Product.objects.filter(category__catalog=current_catalog)
        context['cat'] = Catalog.objects.all()
        return context

    def get_queryset(self):   
        category = get_object_or_404(Catalog, slug__iexact=self.kwargs.get('slug'))
        queryset = category.catalog.all()
        return queryset

2. 修改模板,展示产品并正确跳转

将模板中循环分类的逻辑改为循环产品,跳转时传递产品的slug:

{% for product in products %}
<div class="room-item catalog_items">
    <ul class="hover-effect-cover">
        <li>
            <img src="{{ product.category.img.url }}" alt="{{ product.name }}">
            <div class="effect-to-top">
                <h3>{{ product.name }}</h3>
                <p></p>
                <a href="{% url 'product-detail' product.slug %}" class="button">查看详情</a>
            </div>
        </li>
    </ul>
</div>
{% endfor %}

3. 优化URL配置,明确参数类型

在urls.py中,将slug参数改为明确的<slug:slug>格式,避免参数类型混淆:

urlpatterns = [
    path('', views.CatalogView.as_view(), name='catalog'),
    path('<slug:slug>/', views.CatalogDetailViews.as_view(), name='catalog-detail'),
    path('product/<slug:slug>/', views.ProductDetailViews.as_view(), name='product-detail')
]

额外检查项

  • 确保后台创建的Product对象已正确生成slug(可通过模型信号自动生成,或手动填充)。
  • 可直接使用Product模型的get_absolute_url方法简化模板跳转,例如:<a href="{{ product.get_absolute_url }}">查看详情</a>。

内容的提问来源于stack exchange,提问作者Леонид Акулов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:10:31