如何在 Django 管理仪表板中设置应用程序和模型的顺序

问题描述 投票:0回答:2

我想在 django 仪表板中设置应用程序模型列表的特定顺序。我的模型看起来像这样:

我已经尝试了几个教程像这个并且在SO中查看了其他人的解决方案,就像这个问题如何使用自定义AdminSite类?在Django管理仪表板中设置应用程序和模型的顺序在Django中重新排序应用程序和模型管理员

但是这些都不起作用,它们要么使用第三方库,要么没有指定将代码片段放在哪里。 这个似乎是最有前途的,但我试图把这段代码,

class WebsiteAdminSite(admin.AdminSite):
    def get_app_list(self, request):
        """
        Return a sorted list of all the installed apps that have been
        registered in this site.
        """
        ordering = {
            "Menues": 1,
            "Entrees": 2,
            "First_dishes": 3,
            "Second_dishes": 4,
            "Side_dishes": 5,
            "Desserts": 6,
            "Wines": 7,
            "Opening_hours": 8,
            "Contacts": 9,
            "Gallery_images": 10,
        }
        app_dict = self._build_app_dict(request)
        # a.sort(key=lambda x: b.index(x[0]))
        # Sort the apps alphabetically.
        app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower())

        # Sort the models alphabetically within each app.
        for app in app_list:
            app['models'].sort(key=lambda x: ordering[x['name']])

        return app_list

在我的应用程序的 admin.py 中,但它不起作用。

我无法提供任何错误,因为没有给出任何错误,它根本不起作用。我认为应该是这样,因为在 django 4.1 中应该有可能覆盖 AdminSite,但我无法使其工作。

上面代码中的类应该放在哪里?我还应该在 admin.py 中添加其他内容吗?就像我在这个答案中找到的以下代码行https://stackoverflow.com/questions/58256151/set-ordering-of-apps-and-models-in-django-admin-dashboard

mysite = WebsiteAdminSite()
admin.site = mysite
sites.site = mysite

这几行代码的作用是什么?当我在课后添加它们时,我破坏了代码,并出现了 django.contrib.admin.sites.catch_all_view

引发的错误

更新

根据答案,我添加了我的项目文件夹结构和我所做的更改。 我的项目文件夹现在看起来像这样:

-base
  -base
    admin.py
    apps.py
    asgi.py
    settings.py
    urls.py
    wsgi.py
  -website (the app folder)
    -migrations
    -templates
    admin.py
    apps.py
    models.py
    tests.py
    urls.py
    views.py
  -dbsqlite3
  manage.py

所以我在我的项目文件夹中添加了 admin.py 和我感兴趣的类,添加了该类

class WebsiteAdminConfig(AdminConfig):
    default_site = 'base.admin.WebsiteAdminSite'

在应用程序文件夹(网站)中的 apps.py 中,修改 settings.py 中的 INSTALLED_APPS,现在如下所示:


INSTALLED_APPS = [
    'base.apps.WebsiteAdminConfig',
    #'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'website',
    
]

应用程序文件夹(网站)内的我的 apps.py 如下所示:

from django.apps import AppConfig


class WebsiteConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'website'

以及我的项目文件夹(基础)中的 apps.py :

from django.contrib.admin.apps import AdminConfig

class WebsiteAdminConfig(AdminConfig):
    default_site = 'base.admin.WebsiteAdminSite'

现在我有另一个问题,这条线

app['models'].sort(key=lambda x: ordering[x['name']])

给我一个关键错误“组”

修复了这个问题,它应该可以正常工作。

更新2

为了管理错误,我需要在 WebsiteAdminSite 类的排序字典中添加“组”和“用户”:

  ordering = {
            "Menues": 1,
            "Entrees": 2,
            "First_dishes": 3,
            "Second_dishes": 4,
            "Side_dishes": 5,
            "Desserts": 6,
            "Wines": 7,
            "Opening_hours": 8,
            "Contacts": 9,
            "Gallery_images": 10,
            "Groups":11,
            "Users":12,
        }

python django django-admin
2个回答
1
投票

发布项目的结构会对您有所帮助。类似这样的东西。

- mysite
  - mysite
    - asgi.py
    - settings.py
    - urls.py
    - wsgi.py
  - app
    - admin.py
    - apps.py
    - etc.

上面代码中的类应该放在哪里?

根据 Django documentation,它应该存储在您的项目中

mysite/admin.py
中。像这样:

- mysite
  - mysite
    - admin.py
    - asgi.py
    - settings.py
    - urls.py
    - wsgi.py
  - app
    - admin.py
    - apps.py
    - etc.

根据 Django 文档,您还需要在

AdminConfig
中创建一个
mysite/apps.py
类。

from django.contrib.admin.apps import AdminConfig

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

并将

'django.contrib.admin'
替换为
INSTALLED_APPS
mysite/settings.py
变量中的所述配置类。

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

阅读文档很重要,不要着急。

我还应该在 admin.py 中添加其他内容吗?

取决于您还想定制什么。您不需要添加任何其他内容。如果您想更改更多内容,请查看文档,或者查看 github 上的源代码


0
投票

我找到了有史以来最简单的解决方案。

虽然大多数人依赖第 3 方库,但我注意到使用以下标准 Django 方法将按照您在代码中编写的顺序使用 admin.py 中的“admin.site.register(Model, ModelAdmin)”声明。

没有比这更干净的了!

def get_app_list(self, request, app_label=None):
    app_dict = self._build_app_dict(request, app_label)
    if not app_dict:
        return
    return list(app_dict.values())

admin.AdminSite.get_app_list = get_app_list
© www.soinside.com 2019 - 2024. All rights reserved.