Django 管理站点 URL 路由问题/不一致



我正在开发一个关于 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 命名空间。

最新更新