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
相关产品推荐
相关产品推荐

