我正在开发一个关于 Django 1.10 的网站,我正在尝试设置我的管理站点,以便 URL 位于"/pcari/admin"而不是"/admin">
这是我的根 urls.py:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
# Admin site
url(r'^admin/', admin.site.urls),
# Regular site
url(r'^pcari/', include('pcari.urls')),
]
这是我的应用程序 urls.py:
from django.conf.urls import url
from django.contrib import admin
from . import views
app_name = 'pcari'
urlpatterns = [
# Admin site
url(r'^admin/', admin.site.urls),
# User-facing views
url(r'^$', views.index, name='index'),
...
]
这种设置在技术上的工作原理是,如果我访问"127.0.0.1:8000/pcari/admin",我会得到管理站点,但如果我访问"127.0.0.1:8000/admin",我也会收到管理网站,这是我不想要的。
但是,如果我从根 urls.py 文件中删除"url(r'^admin/', admin.site.urls)"行,当我尝试访问"127.0.0.1:8000/pcari/admin"时会出现一个奇怪的错误:
NoReverseMatch at /pcari/admin/
u'admin' is not a registered namespace
Request Method: GET
Request URL: http://127.0.0.1:8000/pcari/admin/
Django Version: 1.10.5
Exception Type: NoReverseMatch
Exception Value:
在你的主 urls.py
urlpatterns = [
# Admin site
url(r'^pcari/admin/', admin.site.urls),
# Regular site
url(r'^pcari/', include('pcari.urls')),
]
,然后从应用网址中移除管理员网址
但是,如果我从根 urls.py 文件中删除"url(r'^admin/', admin.site.urls)"行,当我尝试访问"127.0.0.1:8000/pcari/admin"时,我会收到一个奇怪的错误:
NoReverseMatch at /pcari/admin/
u'admin' is not a registered namespace
Request Method: GET
Request URL: http://127.0.0.1:8000/pcari/admin/
Django Version: 1.10.5
Exception Type: NoReverseMatch
Exception Value:
原因:
当你从主 urls.py 中删除url(r'^admin/', admin.site.urls),
时,这意味着你没有任何管理员命名空间,因为这行注册了在 django 代码中定义的"admin"命名空间。 https://github.com/django/django/blob/master/django/contrib/admin/sites.py#L279
这一行显示 Django 管理员将注册为"管理员"命名空间
当您在"pcari"应用程序中删除并添加管理站点时,这意味着此应用程序是注册命名空间"pcari"。但是在 django 管理模板中,模板中有硬编码 url,例如 {% url admin:index %},它给出了 NoReverseMatch 异常 https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/base.html#L44 django 模板中存在导致错误的硬编码管理命名空间
编辑:
您在应用网址中添加了
app_name = 'pcari'
这就造成了这个逆向问题。删除此应用名称行。因为如果您添加它,它将用作 pacri 命名空间。