如何在Django Admin面板自定义应用与模型排序
Django后台自定义模型排序问题解决
问题背景
需要在Django 4.1后台面板中为指定应用的模型列表设置自定义排序顺序,当前模型显示状态如下:
尝试过多种教程及社区方案,要么依赖第三方库,要么未明确代码放置位置。其中一个教程的方案逻辑可行,但将代码放入应用的admin.py后无效果,代码如下:
class WebsiteAdminSite(admin.AdminSite): def get_app_list(self, request): """ 返回已注册应用的排序后列表 """ 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) # 按字母顺序排序应用 app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower()) # 为每个应用内的模型按自定义规则排序 for app in app_list: app['models'].sort(key=lambda x: ordering[x['name']]) return app_list
无报错但不生效,尝试添加以下代码时触发django.contrib.admin.sites.catch_all_view错误:
mysite = WebsiteAdminSite() admin.site = mysite sites.site = mysite
项目结构调整与配置
当前项目结构:
-base -base admin.py apps.py asgi.py settings.py urls.py wsgi.py -website(应用文件夹) -migrations -templates admin.py apps.py models.py tests.py urls.py views.py -dbsqlite3 manage.py
正确配置步骤
- 将上述
WebsiteAdminSite类放入项目根目录的base/admin.py文件中 - 修改项目根目录的
base/apps.py,添加自定义Admin配置类:
from django.contrib.admin.apps import AdminConfig class WebsiteAdminConfig(AdminConfig): default_site = 'base.admin.WebsiteAdminSite'
- 修改
settings.py中的INSTALLED_APPS,替换默认的admin应用:
INSTALLED_APPS = [ 'base.apps.WebsiteAdminConfig', #'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'website', ]
新问题修复
配置完成后出现KeyError: 'Groups',原因是排序字典未包含Django自带的Groups和Users模型。
修复方法
在WebsiteAdminSite类的ordering字典中补充这两个模型的排序值:
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, }
内容的提问来源于stack exchange,提问作者LeoB
相关产品推荐
相关产品推荐

