我想在 Django 管理面板中重新排序我的应用程序,我在 SO 中看到了另一个类似问题的一些回复,所以我选择安装此方法:django-modeladmin-reorder
我按照所有步骤操作,但不起作用。这是我实际的 Django 面板
#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
我检查了他们的 github 存储库,它在两个月前更新以支持 Django 2.0,但它的 Python Package Index 版本 0.2 上次上传于 2016-09-08。
所以有可能pip安装仍然会安装不支持Django 2.0的版本
请注意,urlresolvers 模块在 Django 1.10 中已被弃用,并在 2.0 中被删除(django-modeladmin-reorder 仍然依赖于 urlresolvers)
你可以做什么:
如果您已经了解 Django==1.8,请先尝试 django-modeladmin-reorder。
在您的项目中使用 GitHub 上的代码。这是最新提交的链接。 https://github.com/mishbahr/django-modeladmin-reorder/commit/f21929480c398c2628291d74af2f319421f651f3
如果您使用的是 Django 2.0,则必须使用 this commit 编辑 middleware.py。即使存储库也支持 Django 2.0,pip 正在停滞且版本较旧(正如 @Dhaval Savalia 所说)。
之后,这一步:
将 ModelAdminReorder 添加到 MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
...
'admin_reorder.middleware.ModelAdminReorder',
...
)
应替换为:
MIDDLEWARE = [
...
'admin_reorder.middleware.ModelAdminReorder',
...
]
仅此而已。
我遵循了anjaneyulubatta505答案,但它只更改了索引页面中的顺序来更改所有管理页面中的顺序 覆盖
app_list.html
而不是index.html
在任何应用程序中应用anjaneyulubatta505答案中的模板标签
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
并将订单添加到您的
settings.py
from collections import OrderedDict
APP_ORDER = OrderedDict([
("app1", ["Model2", "Model1", "Model3"]),
("app2", ["Model2", "Model5", "Model3"]),
("app3", ["Model1", "Model6", "Model3"]),
])
这是我的
app_list.html
{% load i18n admin_tags %}
{% if app_list %}
{% for app in app_list|sort_apps %}
<div class="app-{{ app.app_label }} module{% if app.app_url in request.path|urlencode %} current-app{% endif %}">
<table>
<caption>
<a href="{{ app.app_url }}" class="section" title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">{{ app.name }}</a>
</caption>
{% for model in app.models %}
<tr class="model-{{ model.object_name|lower }}{% if model.admin_url in request.path|urlencode %} current-model{% endif %}">
{% if model.admin_url %}
<th scope="row"><a href="{{ model.admin_url }}"{% if model.admin_url in request.path|urlencode %} aria-current="page"{% endif %}>{{ model.name }}</a></th>
{% else %}
<th scope="row">{{ model.name }}</th>
{% endif %}
{% if model.add_url %}
<td><a href="{{ model.add_url }}" class="addlink">{% translate 'Add' %}</a></td>
{% else %}
<td></td>
{% endif %}
{% if model.admin_url and show_changelinks %}
{% if model.view_only %}
<td><a href="{{ model.admin_url }}" class="viewlink">{% translate 'View' %}</a></td>
{% else %}
<td><a href="{{ model.admin_url }}" class="changelink">{% translate 'Change' %}</a></td>
{% endif %}
{% elif show_changelinks %}
<td></td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
{% endfor %}
{% else %}
<p>{% translate 'You don’t have permission to view or edit anything.' %}</p>
{% endif %}
我最近写了一篇关于此的文章。这可能有帮助。 我们需要使用模板标签来重新排序应用程序和模型,如下所示。
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
{% for app in app_list|sort_apps %}
参考:https://learnbatta.com/blog/how-to-re-order-apps-models-django/
项目/admin.py
from django.contrib.admin import AdminSite
class MyAdminSite(AdminSite):
site_header = 'My Site'
index_title = ''
def get_app_list(self, request):
app_order = [
'app_1',
'app_2',
'auth',
]
app_order_dict = dict(zip(app_order, range(len(app_order))))
app_list = list(self._build_app_dict(request).values())
app_list.sort(key=lambda x: app_order_dict.get(x['app_label'], 0))
for app in app_list:
if app['app_label'] == 'app_1':
model_order = [
'Model1 verbose name',
'Model2 verbose name',
'Model3 verbose name',
]
model_order_dict = dict(zip(model_order, range(len(model_order))))
app['models'].sort(key=lambda x: model_order_dict.get(x['name'], 0))
return app_list
项目/apps.py
from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
default_site = 'project.admin.MyAdminSite'
项目/设置.py
INSTALLED_APPS = [
'project.apps.MyAdminConfig',
<instead of django.contrib.admin>
...
@tulsluper 给出的回复对我来说几乎是完美的。我发现当我点击管理面板中的类别(应用程序名称)而不是模型时,它死了,因为它正在寻找带有 3 个参数而不是两个参数的 get_app_list 。通过将该重载(从 contrib.admin.sites.py 复制)添加到 project/admin.py 文件中,它能够找到重载,并且一切正常。就我而言,这是我添加到 project/admin.py 程序中的内容:
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["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