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

