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 路由问题/不一致的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序 django 中使用 % url 'admin' % 引用管理站点

反向自定义 django 管理站点 url?

具有父 url 参数的自定义 Django 管理站点

django_registration url 和路由混淆

输入 Django 管理员添加页面后的 URL 重新路由

即使在服务器上长时间不活动之后,如何确保可以通过 url 访问 Docker django 站点?