Django商品目录分类展示产品时出现404错误求助
Django商品目录系统分类跳转404问题修复
问题描述
开发基于Django的商品目录系统时,目录板块功能正常,但点击分类项跳转产品详情页出现404错误。具体表现:后台创建分类test及对应产品product1,点击分类项生成的URL为catalog/product/test,返回404;手动修改为catalog/product/product1可正常显示产品详情。
问题根源
- 参数不匹配:模板中循环的是分类对象,跳转
product-detail时传递的是分类的ID,而product-detail视图是根据slug查找Product对象,分类的标识与产品不匹配,导致找不到对应资源返回404。 - 逻辑错误:分类页面的设计目标应该是展示该分类下的所有产品,而非直接从分类跳转到某一个产品详情。
修复步骤
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,提问作者Леонид Акулов
相关产品推荐
相关产品推荐

