django默认管理admin对象对模型的排序自定义

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',
    ......

 

 
posted @ 2020-10-22 14:27  小小财经  阅读(1151)  评论(0编辑  收藏  举报