在Django管理员中重新排序应用程序和模型

时间:2018-01-17 05:05:20

标签: python django django-models django-admin

我想在我的Django管理面板中重新排序我的应用程序,我在SO中看到了另一个类似问题的回复,所以我去安装这个方法:django-modeladmin-reorder

我按照所有步骤操作,但它无法正常工作。这是我的实际Django面板

enter image description here

#settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    # Disable Django's own staticfiles handling in favour of WhiteNoise, for
    # greater consistency between gunicorn and `./manage.py runserver`. See:
    # http://whitenoise.evans.io/en/stable/django.html#using-whitenoise-in-development
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    'admin_reorder',
    'organization_owners',
    'panel',
    'clients',
]

MIDDLEWARE_CLASSES = (
    'admin_reorder.middleware.ModelAdminReorder',
)


ADMIN_REORDER = (
    # Keep original label and models
    'organization_owners',
    'panel',
    'clients',
)

也在我的requirements.txt

Django==2.0.1
django-extensions==1.9.8
django-modeladmin-reorder==0.2
djangorestframework==3.7.7
flake8==3.5.0

3 个答案:

答案 0 :(得分:2)

我已检查了他们的github repo,并在两个月前更新了支持Django 2.0,但它的Python Package Index version 0.2上次上传于2016-09-08。

因此, pip 安装仍有机会安装不支持Django 2.0的版本

请注意,urlresolvers模块在Django 1.10中已弃用,在2.0中已删除(django-modeladmin-reorder仍依赖于urlresolvers)

你能做什么:

  1. 如果您已经知道Django == 1.8,请先尝试django-modeladmin-reorder。

  2. 在项目的GitHub中使用他们的代码。这是最新提交的链接。 https://github.com/mishbahr/django-modeladmin-reorder/commit/f21929480c398c2628291d74af2f319421f651f3

答案 1 :(得分:2)

如果您正在使用Django 2.0,则必须使用Project download编辑middleware.py。甚至存储库都支持Django 2.0,pip正在停滞和旧版本(正如@Dhaval Savalia所说)。

之后,这一步:

将ModelAdminReorder添加到MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
    ...
    'admin_reorder.middleware.ModelAdminReorder',
    ...
)

应替换为:

MIDDLEWARE = [ 
        ...
        'admin_reorder.middleware.ModelAdminReorder',
        ...
]

这就是全部。

答案 2 :(得分:0)

我最近写了一篇关于这个的文章。它可能会有所帮助。 我们需要使用模板标签来重新排序应用和模型,如下所示。

在设置中添加以下代码

from collections import OrderedDict

APP_ORDER = OrderedDict([
  ("app1", ["Model2", "Model1", "Model3"]),
  ("app2", ["Model2", "Model5", "Model3"]),
  ("app3", ["Model1", "Model6", "Model3"]),
]) 

在模板标签下方添加

from django import template
from django.conf import settings


register = template.Library()


def pop_and_get_app(apps, key, app_label):
    for index, app in enumerate(apps):
        if app[key] == app_label:
            obj = apps.pop(index)
            return obj
    return None

@register.filter
def sort_apps(apps):
    new_apps = []
    order = settings.APP_ORDER
    for app_label in order.keys():
        obj = pop_and_get_app(apps, "app_label", app_label)
        new_apps.append(obj) if obj else None
    apps = new_apps + apps
    for app in apps:
        models = app.get("models")
        app_label = app.get("app_label")
        new_models = []
        order_models = settings.APP_ORDER.get(app_label, [])
        for model in order_models:
            obj = pop_and_get_app(models, "object_name", model)
            new_models.append(obj) if obj else None
        models = new_models + models
        app["models"] = models
    return apps

像下面那样覆盖 admin/index.html

{% for app in app_list|sort_apps %}

参考:https://learnbatta.com/blog/how-to-re-order-apps-models-django/