效果预览
![]()
修改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": "请输入内容"})},
}