zoukankan      html  css  js  c++  java
  • 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',
        ......
     
  • 相关阅读:
    volatile双重检查锁定与延迟初始化
    Maven内置属性,pom属性
    spring-如何将spring源码成功导入Eclipse中
    Java8-函数复合用法
    JavaSE-序列化和反序列化
    JavaSE-java8-谓词复合的用法
    表单验证:nice Validator
    eclipse ide for java ee developers 开发环境搭建(J2EE) 【转载】
    表格
    MyBatis子查询
  • 原文地址:https://www.cnblogs.com/ameile/p/13858059.html
Copyright © 2011-2022 走看看