Django同一视图处理对象增改时出现NoReverseMatch错误如何解决
错误原因
- 报错的核心是URL反向解析不匹配:你配置的
polls:adm_group_detail这个URL名称,绑定的路由规则要求必须传入comp_slug和grp_id两个参数,但是你在adm_group_detail.html模板中调用该URL名称时,创建场景(grp_id=0)下只传了comp_slug一个参数,因此解析失败。 - 你点击新建按钮能正常进入视图是因为按钮用的是
polls:adm_create_group这个名称,对应的路由本来就不需要传grp_id,问题出在渲染详情页模板的环节。
解决方法
方案1:模板中做场景判断
在模板里需要生成该视图URL的位置(比如表单action、跳转链接)根据grp_id的值选择对应的URL名称:
{% if grp_id > 0 %} {% url 'polls:adm_group_detail' comp_slug grp_id %} {% else %} {% url 'polls:adm_create_group' comp_slug %} {% endif %}
方案2:优化URL配置(更推荐)
把两个路由的名称统一为adm_group_detail,和视图的默认参数逻辑对齐,后续调用不需要额外判断:
# 修改原来的两条路由配置 path("<slug:comp_slug>/admin_group_detail/", views.adm_group_detail, name="adm_group_detail"), path("<slug:comp_slug>/admin_group_detail/<int:grp_id>/", views.adm_group_detail, name="adm_group_detail"),
修改后不管是创建还是更新场景,都可以直接用同一个URL名称调用:
- 创建场景:
{% url 'polls:adm_group_detail' comp_slug %} - 更新场景:
{% url 'polls:adm_group_detail' comp_slug grp_id %}
Django会自动匹配对应的路由规则。
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

