DiangoAdmin修改默认后台菜单顺序

效果预览

修改Admin中Apps显示顺序

修改apps,添加额外属性

site.py

# -*- encoding: utf-8 -*-
# 继承并修改AdminSite属性,为每个app添加额外的顺序属性
from django.contrib.admin import AdminSite
from django.contrib.admin.apps import AdminConfig

from django.apps import apps


class CustomAdminSite(AdminSite):
    def _build_app_dict(self, request, label=None):
        app_dict = super()._build_app_dict(request, label=None)

        if label:
            models = {
                m: m_a
                for m, m_a in self._registry.items()
                if m._meta.app_label == label
            }
        else:
            models = self._registry

        for model, model_admin in models.items():
            app_label = model._meta.app_label

            # 获取apps下的order属性,并按照order进行排序
            if hasattr(apps.get_app_config(app_label), 'order'):
                order = apps.get_app_config(app_label).order
            else:
                order = '0'

            app_dict[app_label]['order'] = order

        return app_dict

    def get_app_list(self, request, app_label=None):
        """
        Return a sorted list of all the installed apps that have been
        registered in this site.
        """
        app_dict = self._build_app_dict(request, app_label)

        # Sort the apps alphabetically.
        app_list = sorted(app_dict.values(), key=lambda x: x["order"])

        print('app_list', app_list)

        # Sort the models alphabetically within each app.
        for app in app_list:
            app["models"].sort(key=lambda x: x["name"])

        return app_list


class CustomAdminConfig(AdminConfig):
    default_site = "core.utils.site.CustomAdminSite"

模块/apps.py

# -*- encoding: utf-8 -*-
from django.apps import AppConfig


class IndexConfig(AppConfig):
    name = 'apps.index'
    label = 'apps_index'
    verbose_name = '导航页'
    # 添加order属性
    order = '1'

Settings.py注册

INSTALLED_APPS = [
    # 替换默认的'django.contrib.admin'
    # core.utils是 site.py 所属路径
    'core.utils.site.CustomAdminConfig',
    ...
]

使用 get_app_list 方法

# 使用 get_app_list 方法
from django.contrib import admin

admin.AdminSite.get_app_list 

from django.contrib import admin

def get_app_list(self, request, app_label=None):
    app_dict = self._build_app_dict(request, app_label)

    app_count = len(INSTALLED_APPS) # 获取app数量

    app_list = sorted(app_dict.values(),
                      key=lambda x: INSTALLED_APPS.index(x['app_label'])
                      if x['app_label'] in INSTALLED_APPS else app_count)
                      # 如果应用标签(如app1, app2, 在INSTALLED_APPS中,则按其索引排,
                      # 否则排最后面

    for app in app_list:
        app["models"].sort(key=lambda x: x["name"])

    return app_list


admin.AdminSite.get_app_list = get_app_list  # 覆盖原有的get_app_list方法

修改字段默认类型

# 给`description`字段赋予初始值 `image` + `gallery`
prepopulated_fields = {"description": ("image", 'gallery')}

# 重写字段类型的 widget, attrs 属性可以设置前端样式
formfield_overrides = {
	models.IntegerField: {'widget': widgets.NumberInput(attrs={"style": "width:50em;", })},
	models.CharField: {'widget': widgets.TextInput(attrs={"style": "width:50%;", "placeholder": "请输入内容"})},
}
posted @ 2024-01-08 22:07  似雨若漓  阅读(94)  评论(0)    收藏  举报