Подтвердить что ты не робот

Расширение шаблонов администратора Django - изменение списка изменений

A (не так) быстрый вопрос о расширении шаблонов admin django.

Я пытаюсь изменить список результатов (список изменений в django lingo) конкретной модели, добавив промежуточную строку между результирующими строками (классы row1 и row2), которые содержат некоторые объекты, связанные с этим объектом.

Я искал код, но не нашел способ сделать это. Любые указатели очень ценятся. Код также поможет.

PS: Я знаю, что я должен разрабатывать свой собственный интерфейс, но это внутренний проект, и у меня нет такого времени, чтобы сэкономить. Кроме того, интерфейс django очень приятный.

Спасибо заранее.

4b9b3361

Ответ 1

Чтобы расширить ответ на Yuji, вот некоторые особенности при переопределении change_list_results.html...


Переопределите changelist_view, как описано выше на шаге 1, а также описано здесь, в djangoproject. или, поместив в соответствующий каталог, как на шаге 2 выше. (Обратите внимание, что приведенный выше путь к шагу 2 специфичен для конкретной модели. Спецификация приложения будет /admin/<MyAppName>/change_list.html в любом каталоге, определенном в корте TEMPLATE_DIRS.)

Или (возможно, проще) просто укажите ModelAdmin.change_list_template, как описано здесь с любым открываемым именем файла шаблона. (Хотя, если вы сохраните имя change_list.html, не забудьте внести непосредственно в папку /admin, иначе тег extends вызовет рекурсию.)

class MyModelAdmin(admin.ModelAdmin):
    change_list_template = 'change_list.html' # definitely not 'admin/change_list.html'
    # ...

В вашем шаблоне change_list.html, как минимум,

{% extends "admin/change_list.html" %}
{% load i18n admin_static admin_list %}
{% load myapptags %}

{% block result_list %}
  {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %}
  {% result_list cl %}
  {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %}
{% endblock %}

Создайте пакет /<MyAppName>/templatetags (каталог, содержащий __init__.py), с файлом, соответствующим тегу загрузки выше

# MyAppName/templatetags/myapptags.py

from django import template
from django.contrib.admin.templatetags.admin_list import result_list

register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)

Скопируйте и отредактируйте Django change_list_results.html (как, например, my_change_list_results.html выше), чтобы использовать ваши дополнительные функции.

Обратите внимание, что эти шаги не включают дополнительный контекст для шаблона, но могут быть легко расширены как таковые. (Моя причина для этого заключалась в том, чтобы добавлять классы для CSS и ведущий <tbody>, который не был отсортирован в списке результатов.)


ДОПОЛНИТЕЛЬНОЕ

Чтобы включить дополнительный контекст, измените модуль templatetags следующим образом:

# MyAppName/templatetags/myapptags.py

from django import template
from django.contrib.admin.templatetags.admin_list import result_list as admin_list_result_list

def result_list(cl):
    mycl = {'myextracontext': 'something extra'}
    mycl.update(foo_extra())
    mycl.update(admin_list_result_list(cl))
    return mycl

register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)

Затем значение myextracontext или любое другое foo_extra возвращает может быть включено в ваш шаблон результатов (например, {{ myextracontext }})

Ответ 2

Шаг 1: Переопределение вида списка изменений:
Вам придется переопределить шаблон, а не указать его, как вы можете, с помощью add_view / change_view.

Прежде всего, переопределить    def changelist_view(self, request, extra_context=None): в ModelAdmin. Не забудьте вызвать super(foo, self).changelist_view(request, extra_context) и вернуть это.

Шаг 2: Переопределение шаблонов:
Затем переопределите шаблон изменения списка приложений в templates/admin/my_app/my_model/change_list.html (или нет.. вы можете использовать переопределение глобального списка изменений, если хотите).

Шаг 3: Функция списка результатов копирования
Я думаю, вы можете либо скопировать функциональность result_list (определить новый тег шаблона), либо подделать ее, скопировав и вставив в список функцию и шаблон result_list.

# django.contrib.admin.templatetags.admin_list
def result_list(cl):
    """
    Displays the headers and data list together
    """
    return {'cl': cl,
            'result_hidden_fields': list(result_hidden_fields(cl)),
            'result_headers': list(result_headers(cl)),
            'results': list(results(cl))}
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)

Вы можете видеть, что администратор использует этот шаблон admin/change_list_results.html для визуализации отдельных столбцов, поэтому вам нужно будет использовать один из методов для замены этого тега шаблона.

Поскольку он ищет глобальный шаблон, я бы не стал его переопределять.

Определите новый тег w/new template специально для вашего представления или отправьте result_list(cl) в свой шаблон напрямую и перенесите admin/change_list_results.html для использования непосредственно в шаблоне change_list.html.