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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM