如何在Django中向URL传递两个捕获值?解决NoReverseMatch报错
看起来你遇到了Django反向解析URL的常见问题,咱们一步步来排查解决:
先抓错误核心
错误提示里的arguments '('', '')'是关键信号——这说明你在模板里调用{% url %}时,传递的brand.slug和category.slug都是空字符串,而你的URL模式要求slug是符合[-a-zA-Z0-9_]+格式的非空值,所以Django找不到匹配的路由。另外还有个容易忽略的细节:你在urls.py里定义的URL名称是job_request_step_two,但模板里写的是form_step_two,这两个名称必须完全一致,否则也会触发反向解析失败!
具体解决步骤
1. 修正URL名称匹配
先把模板里的URL调用名称改对,确保和urls.py里的name参数完全一致:
原来的模板代码:
{% url 'form_step_two' brand.slug category.slug %}
改成:
{% url 'job_request_step_two' brand.slug category.slug %}
2. 确保slug参数非空
接下来要排查为什么brand.slug和category.slug是空的:
检查视图上下文传递:确认渲染模板的视图函数中,已经把
brand和category对象正确传入模板上下文了。比如:def your_view(request): # 示例:根据业务逻辑获取对应的brand和category对象 brand = Brand.objects.get(slug="your-brand-slug") category = Category.objects.get(slug="your-category-slug") # 必须把这两个对象放到上下文里,模板才能访问 return render(request, 'your_template.html', {'brand': brand, 'category': category})如果没传这两个变量,模板里的
brand和category会被视为None,访问它们的slug属性会得到空字符串。检查数据库记录的slug值:登录Django后台,查看对应的Brand和Category记录,确认它们的slug字段是否有有效值。如果是自动生成slug(比如用
slugify),要确保生成逻辑正常工作——比如在模型的save()方法里或者通过信号生成slug。循环场景下的对象验证:如果是在循环中使用这个URL标签(比如遍历多个品牌/分类),要确认当前循环的对象不是空的,且每个对象的slug字段都有值。比如:
{% for brand in brand_list %} {% for category in brand.categories.all %} <!-- 确保brand.slug和category.slug都非空 --> {% if brand.slug and category.slug %} <a href="{% url 'job_request_step_two' brand.slug category.slug %}">提交工单</a> {% endif %} {% endfor %} {% endfor %}
验证修复
完成上面的步骤后,再访问页面:如果URL名称匹配且slug参数都有有效值,反向解析就能正常工作了。你也可以在视图里临时打印slug的值来排查:
print(f"Brand slug: {brand.slug}") print(f"Category slug: {category.slug}")
确认输出的不是空字符串,就没问题了。
内容的提问来源于stack exchange,提问作者brunam

