内容简介: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 列表顺序》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Functional Programming in Scala
Paul Chiusano、Rúnar Bjarnason / Softbound print / 2014-9-14 / USD 44.99
Functional programming (FP) is a programming style emphasizing functions that return consistent and predictable results regardless of a program's state. As a result, functional code is easier to test ......一起来看看 《Functional Programming in Scala》 这本书的介绍吧!