Django admin:从单应用项目的 URL 中删除应用名称

Posted

技术标签:

【中文标题】Django admin:从单应用项目的 URL 中删除应用名称【英文标题】:Django admin: removing app name from URL for single-app projects 【发布时间】:2013-09-16 21:09:00 【问题描述】:

我正在编写一个简单的 Django 应用程序——比如说,称为base——它有几个模型。我正在使用 Django 的 built-in admin site 来操作应用程序的数据。管理员可通过默认的^admin/ URL 模式访问。

除了 Django 的默认 INSTALLED_APPS(减去 django.contrib.sites),base 是我项目中安装的唯一应用程序。有什么方法可以从 URL 中删除base/,这样我就可以通过简单地使用诸如/admin/model/ 之类的路径而不是/admin/base/model/ 来访问base 的模型?

我希望django.contrib.auth 的模型仍然可以通过/admin/auth/ 访问。

【问题讨论】:

【参考方案1】:

如果您不想在 URL 中添加base,请不要将其放在此处。除非您特别要求它存在,否则它不存在。只需创建不带该前缀的 URL。

编辑抱歉,我误读了您的问题:我以为您是在询问您的应用程序自己的视图,而不是管理员的子部分。

这很棘手。一种方法是使用挂钩将 URL 添加到基本 AdminSite as described in the docs。您可能需要从 ModelAdmin.get_urls 方法中复制代码并对模型名称进行硬编码,因为无法自动执行此操作。

【讨论】:

我认为管理员在其 URLconf 中的应用程序模型之前需要应用程序名称(如果有的话) - 如果我删除它,那么我只是使用 /model/ 而没有名称在它之前的应用程序,我显然得到了 404。你是说我应该改变 Django 管理员的 URLconf 吗?有什么方法可以在不进入我的 Python 安装的site-packages 的情况下覆盖它?【参考方案2】:

自定义或覆盖您的默认 Django 管理站点非常容易。这是Django documentation。以下是覆盖默认管理站点的示例。

在您的 Django 项目目录中创建一个admin.py(如果还没有的话)。子类化 AdminSite。

要从管理 URL 中删除“appname”,请覆盖 get_urls() 函数:

# myproject/admin.py
from django.contrib import admin

class MyAdminSite(admin.AdminSite):
    def get_urls(self):
        urlpatterns = super().get_urls()
        for model, model_admin in self._registry.items():
            urlpatterns += [
                path('%s/' % (model._meta.model_name), include(model_admin.urls)),
            ]
        return urlpatterns

在您的项目目录中创建一个apps.py(如果还没有的话):

# myproject/admin.py
from django.contrib.admin.apps import AdminConfig

class MyAdminConfig(AdminConfig):
    default_site = 'myproject.admin.MyAdminSite'

在您的settings.py 中注册:

INSTALLED_APPS = [
    ...
    'myproject.apps.MyAdminConfig',  # replaces 'django.contrib.admin'
    ...
]

【讨论】:

以上是关于Django admin:从单应用项目的 URL 中删除应用名称的主要内容,如果未能解决你的问题,请参考以下文章

独立于应用程序的 django admin 上的新 URL

Django admin frontpage 无法通过离开“admin”来正确构建模型 url

通过代理或直接从单页应用程序访问Keycloak Admin API?

django–url

Django Admin:Class Media

获取Django项目的全部url