我想在 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,
}
发布项目的结构会对您有所帮助。类似这样的东西。
- 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 上的源代码。
我找到了有史以来最简单的解决方案。
虽然大多数人依赖第 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