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

Django URL反向解析报错:无法匹配'category'路由参数

解决Django分类筛选的URL反向解析错误

错误根源

你遇到的反向解析错误核心是URL参数命名不匹配,同时URL路径存在语法问题:

  • urls.py里定义的category路径参数用了category.id,但视图函数接收的参数是category_id,两者不对应
  • get_absolute_url里传递的kwargs键是category.id,和URL定义的参数名不一致
  • URL路径语法不完整:缺少闭合的>,部分路径结尾未加斜杠(不符合Django规范)

分步修复

1. 修正urls.py的路径定义

将参数名改为和视图一致的category_id,补全路径语法:

urlpatterns = [
    path('', views.index, name="index"),
    # 补全闭合>和结尾斜杠
    path('detail/<int:product_id>/', views.detail, name="detail"),
    # 参数名改为category_id,补全闭合>和结尾斜杠
    path('category/<int:category_id>/', views.category, name="category")
]

2. 修正Category模型的get_absolute_url方法

把kwargs的键改成category_id,和URL参数名匹配:

class Category(models.Model):
    name = models.CharField(max_length=255, unique=False, blank=True)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.slug

    def get_absolute_url(self):
        # 这里的键改为category_id
        return reverse("product:category", kwargs={"category_id": self.id})

3. 模板调用验证

现在两种方式都可以正常工作:

  • 使用get_absolute_url:
{% for category in categories %}
    {{category.id}}
    <a href="{{category.get_absolute_url}}">{{ category.name }}</a>
{% endfor %}
  • 直接使用{% url %}标签:
{% for category in categories %}
    {{category.id}}
    <a href="{% url 'product:category' category_id=category.id %}">{{ category.name }}</a>
{% endfor %}

可选优化(提升代码可读性)

视图里的产品筛选可以更直观,通过分类对象获取关联产品:

def category(request, category_id):
    # 先获取分类对象,再获取其下的所有产品
    category = Category.objects.get(id=category_id)
    products = category.product_set.all()
    return render(request, 'product/category.html', {'products': products, 'category': category})

内容的提问来源于stack exchange,提问作者Kaynan Kaynan Felipe Rodrigues

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:15:42