Django 管理站点 URL 路由问题/不一致
Posted
技术标签:
【中文标题】Django 管理站点 URL 路由问题/不一致【英文标题】:Django admin site URL routing issues/inconsistencies 【发布时间】:2017-11-13 14:35:31 【问题描述】:我正在开发一个使用 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:
【问题讨论】:
你为什么不把url(r'^admin/', admin.site.urls)
改成url(r'^pcari/admin/', admin.site.urls)
?
【参考方案1】:
在您的主要 urls.py 中
urlpatterns = [
# Admin site
url(r'^pcari/admin/', admin.site.urls),
# Regular site
url(r'^pcari/', include('pcari.urls')),
]
并从应用程序网址中删除管理员网址
【讨论】:
【参考方案2】:但是,如果我从根 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 代码中定义的“管理”命名空间。 https://github.com/django/django/blob/master/django/contrib/admin/sites.py#L279
这一行显示 django admin 将注册为“admin”命名空间
当您在“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 命名空间工作。
【讨论】:
我明白了,谢谢!这是否意味着我必须在根目录下拥有管理页面?有没有希望我有/pcari/admin
的管理页面?
检查更新的答案。从创建命名空间的应用程序 urls.py 中删除 app_name="pcari"以上是关于Django 管理站点 URL 路由问题/不一致的主要内容,如果未能解决你的问题,请参考以下文章