Django中category_site路由反向解析参数匹配报错求助
问题成因
- 报错核心原因是category.html模板引用了不存在的上下文变量:你的
category_site视图向模板传递的上下文只有产品查询集products,没有定义名为product的单个产品实例变量。模板中写{% url 'category_site' product.category %}时,product为未定义的空值,最终传给反向解析的参数是空字符串'',但路由中<slug:category>要求参数必须为符合slug规则的非空字符串,匹配失败就抛出了该反向解析错误。 - 潜在逻辑风险:即使修正变量名,直接从产品查询集上取
category属性也不符合逻辑——查询集是多个产品的集合,本身没有分类属性,你在URL路径中已经拿到了当前分类值,不需要从查询结果中反推分类。
修复方案
按以下步骤调整即可解决问题:
- 修改
category_site视图,将URL中捕获的当前分类值一并传入模板上下文:
def category_site(request, category): category_filter = Q(category__icontains=category) results = Farfocel.objects.filter(category_filter) return render(request, 'category.html', { 'products': results, 'current_category': category # 新增传递当前分类值 })
- 修改category.html的面包屑代码,替换为正确的上下文变量,不再引用不存在的
product:
<ul class="breadcrumbs"> <li class="breadcrumbs__item"> <a href="{% url 'display_records' %}" class="breadcrumbs__link">Home</a> </li> <li class="breadcrumbs__item"> <a href="{% url 'all_products_site' %}" class="breadcrumbs__link">Products</a> </li> <li class="breadcrumbs__item"> <a href="{% url 'category_site' current_category %}" class="breadcrumbs__link breadcrumbs__link--active">{{ current_category }}</a> </li> </ul>
- (可选加固)为避免产品分类字段为空触发同类报错,可在product.html的面包屑中增加非空判断,同时建议在
Farfocel模型的category字段上加非空约束、默认值,从数据源层面杜绝空值:
<li class="breadcrumbs__item"> <a href="{% url 'all_products_site' %}" class="breadcrumbs__link">Products</a> </li> {% if product.category %} <li class="breadcrumbs__item"> <a href="{% url 'category_site' product.category %}" class="breadcrumbs__link">{{ product.category }}</a> </li> {% endif %} <li class="breadcrumbs__item"> <a href="" class="breadcrumbs__link breadcrumbs__link--active">{{ product }}</a> </li>
- (路由规则校验)Django路由按从上到下的顺序匹配,你当前把动态路由
<slug:category>放在路由列表最后是正确的,后续新增同层级静态路由时,必须放在该动态路由前面,避免静态路径被误识别为分类slug触发404。
内容的提问来源于stack exchange,提问作者Darth _
相关产品推荐
相关产品推荐

