Заказ объектов admin.ModelAdmin - PullRequest
33 голосов
/ 29 декабря 2008

Допустим, у меня есть приложение для пиццы с классами Topping и Pizza, которое отображается в Django Admin следующим образом:

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

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

Но я хочу их вот так:

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

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

Как мне настроить это в моем admin.py?

Ответы [ 14 ]

30 голосов
/ 18 марта 2011

Обходной путь, который вы можете попробовать, - это настроить файл 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).

Удачи!

PS: извините, если этот ответ был опубликован слишком поздно, но он может помочь другим в подобных ситуациях в будущем.

18 голосов
/ 09 марта 2012

Мне в итоге удалось это сделать благодаря этому фрагменту Django , вам просто нужно знать настройку ADMIN_REORDER:

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

app1 не должен начинаться с префикса с именем проекта, то есть использовать app1 вместо mysite.app1.

18 голосов
/ 19 октября 2011

Если вы хотите решить эту проблему за 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

Конечно, это не элегантно, но может работать некоторое время, прежде чем мы найдем лучшее решение.

15 голосов
/ 14 сентября 2015

Для этого теперь есть хороший пакет Django:

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

10 голосов
/ 29 декабря 2008

Это на самом деле рассматривается в самом низу Часть 2 Учебного пособия по Джанго .

Вот соответствующий раздел:

Настройка страницы индекса администратора

В похожей заметке вы можете захотеть настроить внешний вид Индексная страница администратора Django.

По умолчанию отображаются все приложения в INSTALLED_APPS, которые были зарегистрирован в приложении администратора, в алфавитном порядке. Вы можете захотеть внести существенные изменения в раскладка. В конце концов, индекс вероятно, самая важная страница админ, и это должно быть легко использовать.

Шаблон для настройки админ / index.html. (Сделать так же, как с admin / base_site.html в предыдущем раздел - скопируйте его из стандартного каталог для вашего пользовательского шаблона каталог.) Отредактируйте файл, и вы видите, он использует переменную шаблона с именем app_list. Эта переменная содержит каждый установлено приложение Django. Вместо того, чтобы использовать что вы можете жестко кодировать ссылки на специфичные для объекта страницы администратора в какой бы способ ты не считал лучшим.

6 голосов
/ 15 мая 2015

Вот фрагмент, использованный Эммануэлем, обновленный для Django 1.8:

В templatetags / 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 %}
4 голосов
/ 19 июня 2018

Ответ в июне 2018

Этот ответ похож на Идея Василя

Я пытался решить подобные проблемы, а потом увидел такой фрагмент .

Я сделал некоторые модификации на основе этого клипа. Код выглядит следующим образом.

# 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

3 голосов
/ 18 января 2012

Также может быть использован небольшой фрагмент кода, который называется 'Пользовательское приложение Django Index Index & Заказ модели' . Фрагмент решает проблему всего за 3 простых редактирования.

Здесь рассмотрим детали. http://djangosnippets.org/snippets/2613/

2 голосов
/ 06 ноября 2013

Если вы используете Suit для AdminSite, вы можете выполнить настройку меню, используя тег меню .

2 голосов
/ 29 декабря 2008

Я добавил его в дорожку Джанго:

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

...