内容简介:Django Admin 主页 APP 列表默认是按照By default, it displays all the apps in
WHY
Django Admin 主页 APP 列表默认是按照 字母顺序 进行排列的,想根据 APP 使用来排序。
https://docs.djangoproject.com/en/2.1/intro/tutorial07/
By default, it displays all the apps in INSTALLED_APPS
that have been registered with the admin application, in alphabetical order
.
https://docs.djangoproject.com/en/2.1/_modules/django/contrib/admin/sites/
def get_app_list(self, request):
"""
Return a sorted list of all the installed apps that have been
registered in this site.
"""
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['models'].sort(key=lambda x: x['name'])
return app_list
网上有多种实现方案:
-
在 每个
APP model 里为 Meta 类下的
verbose_name_plural字段添加 数字前缀 1 -
重写
admin/base.html模板页面 2 -
重写
AdminSite类的index()方法 3
本文使用第三种:重写 AdminSite
类的 index()
方法
HOW
Django 源码 Admin 主页渲染的 app_list
列表是由 get_app_list()
方法按 字母排序
后返回的结果
所以只需要对 app_list
进行 排序 即可
https://docs.djangoproject.com/en/2.1/_modules/django/contrib/admin/sites/
def index(self, request, extra_context=None):
"""
Display the main admin index page, which lists all of the installed
apps that have been registered in this site.
"""
app_list = self.get_app_list(request)
context = {
**self.each_context(request),
'title': self.index_title,
'app_list': app_list,
**(extra_context or {}),
}
request.current_app = self.name
return TemplateResponse(request, self.index_template or 'admin/index.html', context)
首先参考官方文档覆盖 Django Admin 的 AdminSite
类:
https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#overriding-the-default-admin-site
项目名称 zerone
在 zerone/
子目录下创建 zerone/admin.py
文件,重写 AdminSite
的 index()
方法:
from django.contrib import admin
class MyAdminSite(admin.AdminSite):
def index(self, request, extra_context=None):
if extra_context is None:
extra_context = {}
app_list = self.get_app_list(request)
app_dict = self._build_app_dict(request)
# dict_keys(['equipment', 'liveos', 'clone', 'oauth2_provider', 'auth'])
print(app_list, app_dict.keys())
extra_context['app_list'] = app_list
return super(MyAdminSite, self).index(request, extra_context)
创建 zerone/apps.py
文件,自定义 AdminConfig
配置名称:
from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
default_site = 'zerone.admin.MyAdminSite'
使用刚在 zerone/apps.py
自定义的 APP 配置名称,替换默认的 django.contrib.admin
修改 zerone/settings.py
:
INSTALLED_APPS = [
...
'zerone.apps.MyAdminConfig', # replaces 'django.contrib.admin'
...
]
重写 AdminSite
的 index()
方法之前,先查看一下默认 app_dict
包含的 所有
APP 名称:
app_list = self.get_app_list(request) app_dict = self._build_app_dict(request) print(app_list, app_dict.keys()) # dict_keys(['equipment', 'liveos', 'clone', 'oauth2_provider', 'auth'])
默认 get_app_list()
按照字母排序的 APP 顺序是:
'auth', 'oauth2_provider', 'clone', 'equipment', 'liveos'
然后根据上面显示的 所有 APP 名称,自定义 APP 的排序列表:
apps_order_list = ['equipment', 'liveos', 'clone', 'oauth2_provider', 'auth']
然后就是根据自定义的 apps_order_list
对默认的 app_list
进行排序:
from django.contrib import admin
apps_order_list = ['equipment', 'liveos', 'clone', 'oauth2_provider', 'auth']
apps_order_dict = { app: index for index, app in enumerate(apps_order_list) }
class MyAdminSite(admin.AdminSite):
def index(self, request, extra_context=None):
if extra_context is None:
extra_context = {}
app_list = self.get_app_list(request)
app_dict = self._build_app_dict(request)
# dict_keys(['equipment', 'liveos', 'clone', 'oauth2_provider', 'auth'])
print(app_dict.keys())
# https://stackoverflow.com/questions/15650348/sorting-a-list-of-dictionaries-based-on-the-order-of-values-of-another-list
# https://docs.python.org/3/howto/sorting.html
app_list.sort(key=lambda element_dict: apps_order_dict[element_dict["app_label"]])
# print(app_list)
extra_context['app_list'] = app_list
return super(MyAdminSite, self).index(request, extra_context)
DONE
reference
https://docs.python.org/3/howto/sorting.html
You can also use the list.sort()
method. It modifies the list in-place
( and returns None
to avoid confusion ). Usually it’s less convenient than sorted()
- but if you don’t need the original list, it’s slightly more efficient
.
Sorting a list of dictionaries based on the order of values of another list
以上所述就是小编给大家介绍的《手动自定义排列 Django Admin 主页 APP 列表顺序》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解计算机系统(原书第2版)
(美)Randal E.Bryant、David O'Hallaron / 龚奕利、雷迎春 / 机械工业出版社 / 2011-1-1 / 99.00元
本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。 本书的最大优点是为程序......一起来看看 《深入理解计算机系统(原书第2版)》 这本书的介绍吧!