Django 2项目根URL命名空间不生效,配置报错求助
解决Django中include()带namespace却报错的问题
这个问题我之前帮好几个开发者踩过坑,其实核心原因是:你只在根urls里指定了namespace,但没让被包含的main app的URL模块声明对应的app_name。Django 2.0+的版本要求,当使用namespace时,必须明确把它和一个app绑定,要么在app的urls.py里设置,要么通过元组的方式传递。
方法一:在main/urls.py中添加app_name(推荐)
这是最符合Django最佳实践的方式,把app的名称放在自己的URL配置里,逻辑更清晰。修改你的main/urls.py,加上app_name = 'main':
from django.urls import path from . import views # 关键添加这一行 app_name = 'main' urlpatterns = [ # 这里写你的具体路由,比如: # path('', views.home, name='home'), ]
保存后重启服务,报错就会消失了。
方法二:在根urls.py中传递元组(临时方案)
如果你不想修改main的urls.py,也可以在根urls里把include的参数改成一个包含URL模块和app_name的元组:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 改成元组形式:(URL模块, app_name),再指定namespace path('main/', include(('main.urls', 'main'), namespace='main')), ]
不过这种方式不推荐,因为app的标识应该放在app内部,而不是根配置里,不利于代码维护。
为什么之前的写法会报错?
你可能看了旧版的Django文档?其实从Django 2.0开始,官方就明确要求:当在include()中使用namespace参数时,必须同时提供app_name——要么通过被包含模块里的app_name属性,要么通过元组传递。这样Django才能正确映射namespace和对应的app路由,避免混淆。
内容的提问来源于stack exchange,提问作者Randy Tang
相关产品推荐
相关产品推荐

