django2/3中,默認的模型管理中,模型的排序是名稱的字母順序,源代碼位置:.venv/python3.6/site-packages/django/contrib/admin/sites.py中AdminSite
1 def get_app_list(self, request): 2 """ 3 Return a sorted list of all the installed apps that have been 4 registered in this site. 5 """ 6 app_dict = self._build_app_dict(request) 7 8 # Sort the apps alphabetically. 9 app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower()) 10 11 # Sort the models alphabetically within each app. 12 for app in app_list: 13 app['models'].sort(key=lambda x: x['name']) 14 15 return app_list 16 17 @never_cache 18 def index(self, request, extra_context=None): 19 """ 20 Display the main admin index page, which lists all of the installed 21 apps that have been registered in this site. 22 """ 23 app_list = self.get_app_list(request) 24 25 context = { 26 **self.each_context(request), 27 'title': self.index_title, 28 'app_list': app_list, 29 **(extra_context or {}), 30 } 31 32 request.current_app = self.name 33 34 return TemplateResponse(request, self.index_template or 'admin/index.html', context)
以上為django中的源代碼,可以看到
app['models'].sort(key=lambda x: x['name'])為實際的排序算法。
首先參考官方文檔覆蓋 Django Admin 的 AdminSite
類:
https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#overriding-the-default-admin-site
實際的處理方法有以下三種:但本人推薦和采用的是第三種
- 在 每個 APP model 里為 Meta 類下的
verbose_name_plural
字段添加 數字前綴 1 - 重寫
admin/base.html
模板頁面 2 - 重寫
AdminSite
類的index()
方法 3
1、在項目的根目錄下找到項目同名文件夾,比如:項目名稱為myproject,則在它下面的myproject文件下新建admin.py
在其中創建一個類覆蓋默認的管理類:
from django.contrib.admin import AdminSite class ModelIndexReOrder(AdminSite): def get_app_list(self, request): """ Return a sorted list of all the installed apps that have been registered in this site. """ re_order = { 'Company': 101, 'Staff': 102, 'Customer': 201, 'User': 202, } app_dict = self._build_app_dict(request) # 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排序,默認的不排序 if app["app_label"] == 'APP名稱': app['models'].sort(key=lambda x: re_order[x['object_name']]) else: app['models'].sort(key=lambda x: x['name']) return app_list
2、在同樣的目錄下創建apps.py
from django.contrib.admin.apps import AdminConfig #類名隨便,可自己辨認就行 class APPNameModelsConfig(AdminConfig): default_site = '項目名稱(這里就是myproject).admin.ModelIndexReOrder'
3、修改項目默認配置settings中
INSTALLED_APPS = [ # 'django.contrib.admin', 'crm.apps.APPNameModelsConfig', ......