Django升级至2.2后出现NoReverseMatch找不到'uutiset'路由问题
Django 2.2 反向解析NoReverseMatch报错原因及修复方案
报错核心原因
你使用了extranet:uutiset这种带应用命名空间的反向解析语法,但Django 2.x对命名空间和路由命名的要求比1.4严格,你的配置缺失两个必要项:
- 应用路由没有声明
app_name指定命名空间 uutiset对应的路由没有设置name参数和解析名对应
修复步骤
1. 调整应用路由配置(extranet/urls.py)
添加app_name声明命名空间,同时给路由增加name属性:
from django.conf.urls import url from extranet.views import * # Django2.0+必须显式声明应用命名空间,对应模板里的extranet前缀 app_name = 'extranet' urlpatterns = [ # 增加name='uutiset',和模板反向解析的名称完全匹配 url(r'^uutiset/', uutiset, name='uutiset'), ]
2. 确认根路由的include配置(项目根目录的urls.py)
你需要在根路由中引入extranet应用的路由时指定命名空间(如果之前没配置的话):
from django.conf.urls import url, include urlpatterns = [ # 其他系统路由,比如admin路由等 url(r'', include('extranet.urls', namespace='extranet')), ]
如果你的uutiset路由之前是直接写在根路由里,没有用include引入应用路由,要么调整为上面的分层路由写法,要么直接去掉模板中{% url %}里的extranet:前缀,直接写{% url 'uutiset' %},同时给根路由的对应配置加上name='uutiset'即可。
验证
修改完成后重启服务,访问/uutiset/路径即可正常加载模板,反向解析不会再报错。
内容的提问来源于stack exchange,提问作者Jaana
相关产品推荐
相关产品推荐

