Django2.0升级后用简化路由语法出现NoReverseMatch错误求助
让我来帮你拆解下问题根源,以及对应的解决办法:
核心原因1:路由函数用错了
Django 2.0之后,url() 其实是 re_path() 的别名,专门用来处理正则表达式路由;而你想用的简化路径转换器语法(比如 <int:group_id>)是 path() 函数的专属语法。你现在用 url() 包裹路径转换器的写法,会让Django把 <int:group_id> 当成正则表达式的一部分,根本无法正确解析这条路由——相当于这条路由没被有效注册,自然 reverse 找不到匹配项。
核心原因2:路径不匹配
你实际访问的URL是 http://localhost:8000/pledges/group/7/,但你定义的路由路径是 pledge/<int:group_id>/ —— 路径里的 group 和路由中的 pledge 完全对不上,就算路由注册正确,也没法匹配这个访问路径。
修复方法
步骤1:替换路由函数,用path()替代url()
首先修改你的app路由文件(比如 pledges/urls.py),导入 path 并替换掉 url():
from django.urls import path # 替换原来的url导入 from . import views app_name = 'pledges' # 确保已经设置了命名空间,这是reverse用命名空间的前提 urlpatterns = [ # 根据你期望的URL路径调整:如果要匹配/pledges/group/7/,就写'group/<int:group_id>/' path('group/<int:group_id>/', views.pledge, name='pledge_by_group'), ]
步骤2:确保路由路径和访问/生成的URL一致
如果你确实希望访问路径是 /pledges/pledge/7/,那把路由路径改成 path('pledge/<int:group_id>/', ...),同时访问时用这个路径,reverse 生成的URL也会对应上。
验证
修改完成后,重启Django服务,再调用 reverse('pledges:pledge_by_group', kwargs={'group_id': 7}) 应该会生成正确的 /pledges/group/7/(或 /pledges/pledge/7/,取决于你的路由设置),访问这个URL也不会再出现 NoReverseMatch 错误了。
内容的提问来源于stack exchange,提问作者lmiguelvargasf

