• 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',
        ......
     
  • 相关阅读:
    利用python数据分析与挖掘相关资料总结
    pandas库学习笔记(一)Series入门学习
    mysql error:You can't specify target table for update in FROM clause
    查询及删除重复记录的SQL语句
    PHP tripos()函数使用需要注意的问题
    如何用git上传代码到github详细步骤
    这是我的第一篇博客
    html link js
    BOM与DOM
    创建简单的表单
  • 原文地址:https://www.cnblogs.com/ameile/p/13858059.html
Copyright © 2020-2023  润新知