Настройте индексную страницу администратора Django для отображения объектов модели - PullRequest
10 голосов
/ 21 сентября 2011

На странице индекса администратора Django приложение и его модели обычно отображаются в списке.Как объекты модели также могут быть перечислены на этой странице индекса?Вместо того, чтобы отображать только приложение, я хочу также отображать его объекты модели.Как это должно быть настроено?

enter image description here

Ответы [ 3 ]

14 голосов
/ 08 ноября 2011

Я хотел получить ту же функциональность для своего сайта и добавил ее, внеся небольшие изменения в базовую систему django.

Шаг 1: Для начала нам нужен способ указать, какие модели должны иметь свои свойства в списке. Добавьте следующий код к моделям, для которых вы хотите перечислить экземпляры (в models.py):

class Meta:
    list_instances = True

Шаг 2: Нам нужно изменить Django для распознавания и чтения этого нового атрибута. В файле core-django: db / models / options.py, примерно в строке 22, добавьте list_instances к DEFAULT_NAMES:

DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering',
             'unique_together', 'permissions', 'get_latest_by',
             'order_with_respect_to', 'app_label', 'db_tablespace',
             'abstract', 'managed', 'proxy', 'auto_created', 'list_instances')

и в том же файле, примерно в строке 52, создайте поле по умолчанию для этого атрибута сразу после других атрибутов:

self.list_instances = False

Шаг 3 : Нам нужно передать эту информацию в шаблон, который генерирует страницу индекса. В файле core-django: contrib / admin / sites.py, внутри метода index () и внутри части «if has_module_perms:» добавьте следующий код:

instances = []
if (model._meta.list_instances == True):
    instances = model_admin.queryset(None)

Это создаст список экземпляров для отображения, но только если установлен атрибут list_instance. В том же файле, несколькими строками ниже, добавьте эти значения в конструкцию "model_dict".

model_dict = {
    'name': capfirst(model._meta.verbose_name_plural),
    'admin_url': mark_safe('%s/%s/' % (app_label, model.    __name__.lower())),
    'perms': perms,
    'list_instances':model._meta.list_instances,
    'instances': instances,
}

Шаг 4 : Последний шаг - изменить шаблон для поддержки этого. Отредактируйте файл core-django /contrib/admin/templates/admin/index.html или скопируйте этот файл в каталог templates / admin / вашего конкретного приложения. Добавьте несколько строк после стандартного кода для генерации строк, чтобы создать «подстроки», если это применимо. Примерно в строке 40, прямо между "/ tr>" и "{% endfor%}":

{% if model.list_instances %}
    {% for instance in model.instances %}
    <tr>
        <td colspan="2" style="padding-left: 2em;">{{ instance }}</td>
        {% if model.perms.change %}
            <td><a href="{{ model.admin_url }}{{ instance.id }}/" class="changelink">{% trans 'Change' %}</a></td>
        {% else %}
            <td>&nbsp;</td>
        {% endif %}
    </tr>
    {% endfor %}
{% endif %}

Это приведет к тому, что элемент будет перечислен с именем, сгенерированным методом unicode () в модели.

Шаг 5 : И вот! Это должно выглядеть примерно так:

enter image description here

Edit: Необязательный шаг 6 : Если вы хотите, чтобы имена экземпляров тоже были кликабельными, просто измените шаблон (index.html) и замените:

<td colspan="2" style="padding-left: 2em;">{{ instance }}</td>

с:

<td colspan="2" style="padding-left: 2em;">        
    {% if model.perms.change %}            
        <a href="{{ model.admin_url }}{{ instance.id}}">{{ instance }}</a>
    {% else %}
        {{ instance }}
    {% endif %}
</td>
1 голос
/ 01 сентября 2016

ОБНОВЛЕНИЕ Ответ Setomidor для Джанго 10

Всегда здорово вернуться к этому чистому решению!

шаг 2 - это около линии 125 (было 52)

шаг 3 - в sites.py - обновить новый метод -

_build_app_dict

внутри цикла for: for model, model_admin in models.items():

добавить шаг 3, как сказано вокруг строк 430 и 460

instances = []


if (model._meta.list_instances == True):
    instances = model_admin.get_queryset(None)
1 голос
/ 21 сентября 2011

Вы можете сделать это, изменив различные шаблоны администратора - корневой называется app_index.html и управляет тем, что там отображается. Лучший способ выяснить, что происходит, где установить django-debug-toolbar, а затем посмотреть на шаблоны, используемые для каждого представления, чтобы выяснить, как настроить.

...