45

假设我的披萨应用程序带有 Topping 和 Pizza 类,它们在 Django Admin 中显示如下:

PizzaApp
-
Toppings      >>>>>>>>>>      Add / Change

Pizzas        >>>>>>>>>>      Add / Change

但我希望他们是这样的:

PizzaApp
-
Pizzas        >>>>>>>>>>      Add / Change

Toppings      >>>>>>>>>>      Add / Change

如何在我的 admin.py 中配置它?

4

21 回答 21

46

您可以尝试的解决方法是调整您的 models.py,如下所示:

class Topping(models.Model):
    .
    .
    .
    class Meta:
        verbose_name_plural = "2. Toppings"

class Pizza(models.Model):
    .
    .
    .
    class Meta:
        verbose_name_plural = "1. Pizzas"

不确定它是否违反 django 的最佳实践,但它可以工作(用 django trunk 测试)。

祝你好运!

PS:对不起,如果这个答案发布得太晚了,但它可以帮助其他人在未来的类似情况下。

于 2011-03-17T21:56:30.237 回答
29

如果你想在 10 秒内解决这个问题,只需在 verbose_name_plural 中使用空格,例如:

class Topping(models.Model):
    class Meta:
        verbose_name_plural = "  Toppings" # 2 spaces

class Pizza(models.Model):
    class Meta:
        verbose_name_plural = " Pizzas" # 1 space

当然,它并不优雅,但在我们得到更好的解决方案之前可能会工作一段时间。

于 2011-10-19T18:33:53.173 回答
22

多亏了这个Django 片段,我最终设法做到了,您只需要注意ADMIN_REORDER设置:

ADMIN_REORDER = (
    ('app1', ('App1Model1', 'App1Model2', 'App1Model3')),
    ('app2', ('App2Model1', 'App2Model2')),
)

app1不得以项目名称为前缀,即使用app1而不是mysite.app1.

于 2012-03-08T20:38:20.563 回答
19

现在有一个不错的 Django 包:

https://pypi.python.org/pypi/django-modeladmin-reorder

于 2015-09-14T19:56:47.870 回答
15

2018 年 6 月的答复

这个答案类似于Vasil 的想法

我试图解决类似的问题,然后我看到了这样的片段

我根据这个剪辑做了一些修改。代码如下。

# myproject/setting.py
...
# set my ordering list
ADMIN_ORDERING = [
    ('pizza_app', [
        'Pizzas',
        'Toppings'
    ]),
]
# Creating a sort function
def get_app_list(self, request):
    app_dict = self._build_app_dict(request)
    for app_name, object_list in ADMIN_ORDERING:
        app = app_dict[app_name]
        app['models'].sort(key=lambda x: object_list.index(x['object_name']))
        yield app


# Covering django.contrib.admin.AdminSite.get_app_list
from django.contrib import admin

admin.AdminSite.get_app_list = get_app_list
...

请注意,此排序功能中使用的排序列表包含系统中所有应用程序及其模块的排序。如果不需要,请根据自己的需要设计排序功能。

它在 Django 2.0 上运行良好

于 2018-06-19T18:10:25.963 回答
13

这实际上是在编写你的第一个 Django 应用程序的最底部,第 7 部分。

这是相关部分:

自定义管理索引页面

同样,您可能想要自定义 Django 管理索引页面的外观。

默认情况下,它会按字母顺序显示 INSTALLED_APPS 中已向管理应用程序注册的所有应用程序。您可能希望对布局进行重大更改。毕竟 index 可能是 admin 最重要的页面,应该很容易使用。

要自定义的模板是 admin/index.html。(对上一节中的 admin/base_site.html 执行相同操作——将其从默认目录复制到您的自定义模板目录。)编辑该文件,您将看到它使用了一个名为 app_list 的模板变量。该变量包含每个已安装的 Django 应用程序。您可以使用您认为最好的任何方式硬编码指向特定于对象的管理页面的链接,而不是使用它。

于 2008-12-29T18:41:12.610 回答
6

这是 Emmanuel 使用的代码片段,针对 Django 1.8 进行了更新:

在模板标签/admin_reorder.py 中:

from django import template
from django.conf import settings
from collections import OrderedDict

register = template.Library()

# from http://www.djangosnippets.org/snippets/1937/
def register_render_tag(renderer):
    """
    Decorator that creates a template tag using the given renderer as the 
    render function for the template tag node - the render function takes two 
    arguments - the template context and the tag token
    """
    def tag(parser, token):
        class TagNode(template.Node):
            def render(self, context):
                return renderer(context, token)
        return TagNode()
    for copy_attr in ("__dict__", "__doc__", "__name__"):
        setattr(tag, copy_attr, getattr(renderer, copy_attr))
    return register.tag(tag)

@register_render_tag
def admin_reorder(context, token):
    """
    Called in admin/base_site.html template override and applies custom ordering
    of apps/models defined by settings.ADMIN_REORDER
    """
    # sort key function - use index of item in order if exists, otherwise item
    sort = lambda order, item: (order.index(item), "") if item in order else (
        len(order), item)
    if "app_list" in context:
        # sort the app list
        order = OrderedDict(settings.ADMIN_REORDER)
        context["app_list"].sort(key=lambda app: sort(order.keys(),
            app["app_url"].strip("/").split("/")[-1]))
        for i, app in enumerate(context["app_list"]):
            # sort the model list for each app
            app_name = app["app_url"].strip("/").split("/")[-1]
            if not app_name:
                app_name = app["name"].lower()
            model_order = [m.lower() for m in order.get(app_name, [])]
            context["app_list"][i]["models"].sort(key=lambda model:
            sort(model_order, model["admin_url"].strip("/").split("/")[-1]))
    return ""

在 settings.py 中:

ADMIN_REORDER = (
    ('app1', ('App1Model1', 'App1Model2', 'App1Model3')),
    ('app2', ('App2Model1', 'App2Model2')),
)

(在此处插入您自己的应用程序名称。管理员会将缺少的应用程序或模型放在列表的末尾,只要您在每个应用程序中至少列出两个模型。)

在您的 base_site.html 副本中:

{% extends "admin/base.html" %}
{% load i18n admin_reorder %}

{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}

{% block branding %}
{% admin_reorder %}
<h1 id="site-name">{% trans 'Django administration' %}</h1>
{% endblock %}

{% block nav-global %}{% endblock %}
于 2015-05-15T02:37:34.233 回答
3

还可以使用一个名为“Django Admin Index Custom App & Model Ordering”的小代码。该片段只需 3 次简单的编辑即可解决问题。

在这里看看细节。 http://djangosnippets.org/snippets/2613/

于 2012-01-18T14:04:15.630 回答
2

我将它添加到 Django 的跟踪中:

http://code.djangoproject.com/ticket/9928

于 2008-12-29T18:40:15.810 回答
2

如果您使用Suit for the AdminSite,您可以使用menu tag进行菜单自定义。

于 2013-11-06T13:12:55.640 回答
2

我正在寻找一个简单的解决方案,我可以在管理面板中按应用程序的名称对应用程序进行排序。我想出了以下模板标签:

from django import template
from django.conf import settings
register = template.Library()

@register.filter
def sort_apps(apps):
    apps.sort(
        key = lambda x:
        settings.APP_ORDER.index(x['app_label'])
        if x['app_label'] in settings.APP_ORDER
        else len(apps)
    )
    print [x['app_label'] for x in apps]
    return apps

然后,只需覆盖templates/admin/index.html并添加该模板标签:

{% extends "admin/index.html" %}
{% block content %}
{% load i18n static sort_apps %}
<div id="content-main">

{% if app_list %}
    {% for app in app_list|sort_apps %}
        <div class="app-{{ app.app_label }} module">
        <table>
        <caption>
            <a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a>
        </caption>
        {% for model in app.models %}
            <tr class="model-{{ model.object_name|lower }}">
            {% if model.admin_url %}
                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
            {% else %}
                <th scope="row">{{ model.name }}</th>
            {% endif %}

            {% if model.add_url %}
                <td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td>
            {% else %}
                <td>&nbsp;</td>
            {% endif %}

            {% if model.admin_url %}
                <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
            {% else %}
                <td>&nbsp;</td>
            {% endif %}
            </tr>
        {% endfor %}
        </table>
        </div>
    {% endfor %}
{% else %}
    <p>{% trans "You don't have permission to edit anything." %}</p>
{% endif %}
</div>
{% endblock %}

然后自定义APP_ORDERsettings.py中的:

APP_ORDER = [
    'app1',
    'app2',
    # and so on...
]

它在 Django 1.10 上运行良好

于 2016-12-04T19:35:15.540 回答
2
ADMIN_ORDERING = {
    "PizzaApp": [
        "Pizzas",
        "Toppings",
    ],
}


def get_app_list(self, request):
    app_dict = self._build_app_dict(request)
    for app_name, object_list in app_dict.items():
        if app_name in ADMIN_ORDERING:
            app = app_dict[app_name]
            app["models"].sort(
                key=lambda x: ADMIN_ORDERING[app_name].index(x["object_name"])
            )
            app_dict[app_name]
            yield app
        else:
            yield app_dict[app_name]


admin.AdminSite.get_app_list = get_app_list

这个解决方案对我有用,修改了林伟雄的那个。

您可以保留默认的身份验证顺序并指定您自己的。

于 2021-08-23T16:50:11.333 回答
1

这是一个为您提供更多灵活性的版本,即:

  • 您可以部分定义应用程序排序,其余部分由 Django 添加到列表中
  • 您可以指定模块的顺序,或避免定义它,而是使用 '*'
  • 您定义的应用程序顺序将首先出现,然后是所有其余应用程序附加在它之后
  • 要检查您的应用程序的名称,请查看应用apps.py程序目录中的文件并检查名称属性,class Config(AppConfi):或者如果不存在,请使用项目中应用程序的目录名称。

在文件中的某处添加此代码settings.py

# ======[Setting the order in which the apps/modules show up listed on Admin]========
# set my ordering list
ADMIN_ORDERING = [
    ('crm', '*'),
    ('property', '*'),
]


# Creating a sort function
def get_app_list(self, request):
    """
    Returns a sorted list of all the installed apps that have been
    registered in this site.

    Allows for:
        ADMIN_ORDERING = [
            ('app_1', [
                'module_1',
                'module_2'
            ]),
            ('app_2', '*'),
        ]
    """

    app_dict = self._build_app_dict(request)

    # Let's start by sorting the apps alphabetically on a list:
    app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower())

    # Sorting the models alphabetically within each app.
    for app in app_list:
        if app['app_label'] in [el[0] for el in ADMIN_ORDERING]:
            app_list.remove(app)
        else:
            app['models'].sort(key=lambda x: x['name'])

    # Now we order the app list in our defined way in ADMIN_ORDERING (which could be a subset of all apps).
    my_ordered_apps = []
    if app_dict:
        for app_name, object_list in ADMIN_ORDERING:
            app = app_dict[app_name]
            if object_list == '*':
                app['models'].sort(key=lambda x: x['name'])
            else:
                app['models'].sort(key=lambda x: object_list.index(x['object_name']))
            my_ordered_apps.append(app)

        # Now we combine and arrange the 2 lists together
        my_ordered_apps.extend(app_list)

    return my_ordered_apps

# Covering django.contrib.admin.AdminSite.get_app_list
from django.contrib import admin
admin.AdminSite.get_app_list = get_app_list
# =========================================

这无非就是覆盖了Django在文件python2.7/site-packages/django/contrib/admin/sites.py上定义的函数。

get_app_list方法class AdminSite(object):生成项目中所有应用程序的数据结构,包括 Django 的身份验证应用程序,例如:

[
  {
    "app_label": "auth",
    "app_url": "/admin/auth/",
    "has_module_perms": "True",
    "models": [
      {
        "add_url": "/admin/auth/group/add/",
        "admin_url": "/admin/auth/group/",
        "name": "<django.utils.functional.__proxy__ object at 0x11057f990>",
        "object_name": "Group",
        "perms": {
          "add": "True",
          "change": "True",
          "delete": "True"
        }
      },
      {
        "add_url": "/admin/auth/user/add/",
        "admin_url": "/admin/auth/user/",
        "name": "<django.utils.functional.__proxy__ object at 0x11057f710>",
        "object_name": "User",
        "perms": {
          "add": "True",
          "change": "True",
          "delete": "True"
        }
      }
    ],
    "name": "<django.utils.functional.__proxy__ object at 0x108b81850>"
  },
  {
    "app_label": "reservations",
    "app_url": "/admin/reservations/",
    "has_module_perms": "True",
    "models": [
      {
        "add_url": "/admin/reservations/reservationrule/add/",
        "admin_url": "/admin/reservations/reservationrule/",
        "name": "<django.utils.functional.__proxy__ object at 0x11057f6d0>",
        "object_name": "ReservationRule",
        "perms": {
          "add": "True",
          "change": "True",
          "delete": "True"
        }
      }
    ],
    "name": "Availability"
  },
  {
    "app_label": "blog",
    "app_url": "/admin/blog/",
    "has_module_perms": "True",
    "models": [
      {
        "add_url": "/admin/blog/category/add/",
        "admin_url": "/admin/blog/category/",
        "name": "Categories",
        "object_name": "Category",
        "perms": {
          "add": "True",
          "change": "True",
          "delete": "True"
        }
      },
      {
        "add_url": "/admin/blog/post/add/",
        "admin_url": "/admin/blog/post/",
        "name": "<django.utils.functional.__proxy__ object at 0x11057f110>",
        "object_name": "Post",
        "perms": {
          "add": "True",
          "change": "True",
          "delete": "True"
        }
      },
      {
        "add_url": "/admin/blog/tag/add/",
        "admin_url": "/admin/blog/tag/",
        "name": "<django.utils.functional.__proxy__ object at 0x11057f390>",
        "object_name": "Tag",
        "perms": {
          "add": "True",
          "change": "True",
          "delete": "True"
        }
      }
    ],
    "name": "Blog"
  },
(...)
]
于 2019-06-09T17:14:00.103 回答
0

这只是黑暗中的一次野刺,但是您调用 admin.site.register(< Model class >, < ModelAdmin class >) 的顺序是否有可能确定显示顺序?实际上,我怀疑这是否可行,因为我相信 Django 维护了一个作为标准 Python 字典实现的 Model -> ModelAdmin 对象的注册表,它不维护迭代顺序。

如果这不符合您的要求,您可以随时使用 django/contrib/admin 中的源代码。如果您需要维护迭代顺序,您可以将 AdminSite 类(在 admin/sites.py 中)中的 _registry 对象替换为维护键插入顺序的 UserDict 或 DictMixin。(但请对这个建议持保留态度,因为我自己从未做过这些改变,我只是对 Django 如何迭代 ModelAdmin 对象的集合进行有根据的猜测。我确实认为 django/contrib但是,/admin/sites.py 是查找此代码的地方,而 AdminSite 类以及 register() 和 index() 方法尤其是您想要的。)

显然,这里最好的事情是您可以在自己的 /admin.py 模块中指定一个简单的选项。我相信这就是您希望收到的答案。不过,我不确定这些选项是否存在。

于 2008-12-29T18:17:19.880 回答
0

我的解决方案是创建 django.contrib.admin.sites.AdminSite 和 django.contrib.admin.options.ModelAdmin 的子类。

我这样做是为了为每个应用程序显示一个更具描述性的标题,并为每个应用程序中模型的外观排序。因此,我的 settings.py 中有一个 dict,它将 app_labels 映射到描述性名称以及它们应该出现的顺序,模型按我在管理站点注册时在每个 ModelAdmin 中提供的序数字段排序。

尽管文档中鼓励创建自己的 AdminSite 和 ModelAdmin 子类,但我的解决方案最终看起来像一个丑陋的黑客。

于 2009-07-16T23:48:17.580 回答
0

lib\site-packages\django\contrib\admin\templates\admin\index.html模板复制到project1\templates\admin\目录,其中project1是您的项目的名称。

在复制的文件中,即project1\templates\admin\index.html替换行:

{% block content %} 
...
{% endblock %}

和:

{% block content %}
<div id="content-main">

{% if app_list %}
    <div class="module">
        <table>
            <caption>App 1</caption>
            <tr>  <th>  <a href="/admin/app1/model1/">Model 1</a>  </th>  <td>Description of model 1</td>  </tr>
            <tr>  <th>  <a href="/admin/app1/model2/">Model 2</a>  </th>  <td>Description of model 1</td>  </tr>
            <tr>  <th>  <a href="..."                >...</a>      </th>  <td>...</td>                     </tr>
        </table>
    </div>

    <div class="module">
        <table>
            <caption>Authentication and authorization</caption>
            <tr>  <th>  <a href="/admin/auth/user/"  >Users</a>    </th>  <td>List of users</td>           </tr>
            <tr>  <th>  <a href="/admin/auth/group/" >Groups</a>   </th>  <td>List of users' groups</td>   </tr>
        </table>
    </div>
{% else %}
    <p>{% trans "You don't have permission to view or edit anything." %}</p>
{% endif %}

</div>
{% endblock %}  

在哪里:

  • app1 是带有模型的应用程序的名称,
  • modeli 是 中第 i 个模型的名称app1

如果您在项目中定义了多个具有模型的应用程序,则只需在上述index.html文件中添加另一个表。

因为我们改变了模板,所以我们可以自由地改变它的 HTML 代码。例如,我们可以添加对模型的描述,如上所示。您还可以恢复添加更改链接——我删除了它们,因为我认为它们是多余的。

答案是来自Dave Kasper 的答案的实际演示。

于 2019-07-11T12:17:49.823 回答
0

custom_admin.py

from django.contrib.admin import AdminSite


class CustomAdminSite(AdminSite):
    def get_urls(self):
        urls = super(MyAdminSite, self).get_urls()
        return urls

    def get_app_list(self, request):
        app_dict = self._build_app_dict(request)
        ordered_app_list = []

        if app_dict:
            # TODO: change this dict
            admin_ordering = {
                'app1': ('Model1', 'Model2'),
                'app2': ('Model7', 'Model4'),
                'app3': ('Model3',),
            }

            ordered_app_list = []
            for app_key in admin_ordering:
                app = app_dict[app_key]
                app_ordered_models = []
                for model_name in admin_ordering[app_key]:
                    for model in app_dict[app_key]['models']:
                        if model['object_name'] == model_name:
                            app_ordered_models.append(model)
                            break

                app['models'] = app_ordered_models
                ordered_app_list.append(app)

        return ordered_app_list

admin_site = CustomAdminSite()

网址.py

from custom_admin import admin_site

urlpatterns = [
    path('admin/', admin_site.urls),
]
于 2020-11-28T08:13:27.170 回答
0

将以下代码添加到您的 settings.py 中:

def get_app_list(self, request):
    """
    Return a sorted list of all the installed apps that have been
    registered on this site.
    """
    ordering = {
        # for superuser
        'Group': 1,
        'User': 2,

        # fist app
        'TopMessage': 101,
        'Slider': 102,
        'ProductCategory': 103,
        'Product': 104,
        'ProductPicture': 105,
        
        # 2nd app
        'ProductReview': 201,
        'Promotion': 202,
        'BestSeller': 203,
    }
    app_dict = self._build_app_dict(request)
    app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower())

    for app in app_list:
        app['models'].sort(key=lambda x: ordering[x['object_name']])

    return app_list


admin.AdminSite.get_app_list = get_app_list

并更改排序字典以匹配您的应用程序和模型。就是这样。

我的解决方案的好处是,如果用户是超级用户,它将显示“auth”模型。

于 2021-05-05T19:42:56.180 回答
0

默认情况下,Django 按字母顺序对 admin 中的模型进行排序。所以Event admin中模型的顺序是Epic、EventHero、EventVillain、Event

相反,您希望订单是

  • EventHero、EventVillain、Epic 然后是事件。

用于呈现管理索引页面的模板是admin/index.html,视图功能是ModelAdmin.index.

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)

方法get_app_list,设置模型的顺序。:

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

因此,要将我们覆盖的顺序设置get_app_list为:

class EventAdminSite(AdminSite):
def get_app_list(self, request):
    """
    Return a sorted list of all the installed apps that have been
    registered in this site.
    """
    ordering = {
        "Event heros": 1,
        "Event villains": 2,
        "Epics": 3,
        "Events": 4
    }
    app_dict = self._build_app_dict(request)
    # a.sort(key=lambda x: b.index(x[0]))
    # 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: ordering[x['name']])

    return app_list

代码app['models'].sort(key=lambda x: ordering[x['name']])设置了固定的顺序。您的应用现在看起来像这样。

在此处输入图像描述

检查文档

于 2021-07-20T05:43:46.127 回答
0

Settings.py文件设置中,应用程序/模块显示在管理员上的顺序

设置我的订购单

ADMIN_ORDERING = [
    ('Your_App1', '*'),
    ('Your_App2', '*'),
]

在 ADMIN_ORDERING 下创建排序函数

def get_app_list(self, request):
    """
    You Can Set Manually Ordering For Your Apps And Models   

        ADMIN_ORDERING = [
            ('Your_App1', [
                'module_1',
                'module_2'
            ]),
            ('Your_App2', '*'),
        ]
    """

    app_dict = self._build_app_dict(request)

    # Let's start by sorting the apps alphabetically on a list:
    app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower())

    # Sorting the models alphabetically within each app.
    for app in app_list:
        if app['app_label'] in [el[0] for el in ADMIN_ORDERING]:
            app_list.remove(app)
        else:
            app['models'].sort(key=lambda x: x['name'])

    # Now we order the app list in our defined way in ADMIN_ORDERING (which could be a subset of all apps).
    my_ordered_apps = []
    if app_dict:
        for app_name, object_list in ADMIN_ORDERING:
            app = app_dict[app_name]
            if object_list == '*':
                app['models'].sort(key=lambda x: x['name'])
            else:
                app['models'].sort(key=lambda x: object_list.index(x['object_name']))
            my_ordered_apps.append(app)

        # Now we combine and arrange the 2 lists together
        my_ordered_apps.extend(app_list)

    return my_ordered_apps

# Covering django.contrib.admin.AdminSite.get_app_list
from django.contrib import admin
admin.AdminSite.get_app_list = get_app_list
于 2021-07-20T06:23:20.150 回答
0

一个非常简单且自包含的方法可以使用装饰器模式以这种方式来使用您的应用程序和模块:

# admin.py

from django.contrib import admin

def app_resort(func):                                                                                            
    def inner(*args, **kwargs):                                                                                            
        app_list = func(*args, **kwargs)
        # Useful to discover your app and module list:
        #import pprint                                                                                          
        #pprint.pprint(app_list)

        app_sort_key = 'name'
        app_ordering = {
            "APP_NAME1": 1,
            "APP_NAME2": 2,
            "APP_NAME3": 3,
        }

        resorted_app_list = sorted(app_list, key=lambda x: app_ordering[x[app_sort_key]] if x[app_sort_key] in app_ordering else 1000)

        model_sort_key = 'object_name'
        model_ordering = {
            "Model1": 1,
            "Model2": 2,
            "Model3": 3,
            "Model14": 4,
        }
        for app in resorted_app_list:
            app['models'].sort(key=lambda x: model_ordering[x[model_sort_key]] if x[model_sort_key] in model_ordering else 1000)
        return resorted_app_list
    return inner                                                                                            
                   
admin.site.get_app_list = app_resort(admin.site.get_app_list)

此代码仅将排序字典中定义的键排序在顶部,而将所有其他键留在底部。该方法很干净,但它需要在之前执行 get_app_list ......当性能很重要并且你有一个很大的 app_list 时,这可能不是一个好主意。

于 2021-11-25T07:55:22.023 回答