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

Django模板获取分类URL报错,实现点击分类展示对应商品问题求助

问题原因与修复方案

1. 基础报错直接修复

  • 模板extends标签缺失闭合符号,原代码{% extends 'Base/base.html %}修正为:
{% extends 'Base/base.html' %}
  • 模板url名称与urls.py定义不匹配:urls.py中电子书分类的路由name是ebooks,你模板中写的'ebook'名称错误,修正后示例:
<a href="{% url 'ebooks' catslug=category.slug %}">电子书</a>
  • a标签语法错误:缺少href属性闭合引号、缺少链接展示文本,按上面示例修正即可。
  • 如果模板中的instance是商品对象,分类slug属于关联的Category模型,参数要改成catslug=instance.category.slug,不要直接调用instance.catslug(除非你在Product模型中冗余存储了分类slug字段)。
  • urls.py路径顺序错误:当前product-detail的<slug:slug>/路径写在所有分类路径前面,会优先匹配ebook/xxx这类分类路径导致跳转错误,需要把静态固定前缀的路径移到动态slug路径前面,修正后的urls.py:
from django.urls import path
from .views import ProductView, ProductDetailView, eBookView, IllustrationView, PhotosView, WebsiteTemplatesView

urlpatterns = [
    path('', ProductView.as_view(), name = 'products'),
    # 固定前缀的分类路径放前面
    path('ebook/<slug:catslug>/', eBookView.as_view(), name = 'ebooks'),
    path('illustration/<slug:catslug>/', IllustrationView.as_view(), name = 'illustration'),
    path('photos/<slug:catslug>/', PhotosView.as_view(), name = 'photos'),
    path('website-templates/<slug:catslug>/', WebsiteTemplatesView.as_view(), name = 'website-templates'),
    # 动态路径放最后
    path('<slug:slug>/', ProductDetailView.as_view(), name = 'product-detail'),
]

2. 逻辑优化方案

你现在每个分类单独写一个视图的方案冗余度极高,后续加新分类还要新增视图、新增路由,建议替换为通用分类视图:

# views.py 新增通用分类视图,删除原有单个分类的视图
class CategoryView(View):
    def get(self, request, catslug):
        # 根据传入的分类slug获取分类对象,不存在直接返回404
        category = get_object_or_404(Category, slug=catslug)
        # 过滤对应分类的上架商品
        products = Product.objects.filter(category=category, is_active=True)
        context = {
            'category': category,
            'products': products
        }
        # 所有分类共用一套模板即可,不需要每个分类单独写模板
        return render(request, 'Product/category.html', context)

对应urls.py只需要保留一条分类路由即可:

path('category/<slug:catslug>/', CategoryView.as_view(), name='category-products'),

导航栏可以直接遍历所有分类渲染链接,不需要硬写每个分类的跳转地址:

{% for category in categories %}
<a href="{% url 'category-products' catslug=category.slug %}">{{ category.name }}</a>
{% endfor %}

记得在渲染导航栏的视图(比如全局上下文、首页ProductView)中把全部分类传入模板:

context = {
    'products': products,
    'categories': Category.objects.all()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:05