Создание админских представлений
Наиболее распространённое использование пользовательских представлений в админке Wagtail — предоставление интерфейса для управления объектами Django модели. Приложение ModelAdmin упрощает эту задачу, предоставляя готовые представления для отображения, создания и редактирования объектов с минимальной настройкой.
Для других типов админских представлений, не подходящих под эту схему, вы можете написать собственные Django представления и зарегистрировать их в админке Wagtail через хуки. В этом примере мы реализуем представление, отображающее календарь на текущий год, используя модуль calendar из стандартной библиотеки Python.
Определение представления
В проекте Wagtail создайте новое wagtailcalendar приложение с ./manage.py startapp wagtailcalendar и добавьте его в INSTALLED_APPS вашего проекта. (В этом случае мы используем имя «wagtailcalendar», чтобы избежать конфликта со стандартным модулем Python calendar. В общем случае нет необходимости использовать префикс «wagtail».)
Отредактируйте views.py следующим образом — обратите внимание, что это обычное Django представление без кода, специфичного для Wagtail.
import calendar
from django.http import HttpResponse
from django.utils import timezone
def index(request):
current_year = timezone.now().year
calendar_html = calendar.HTMLCalendar().formatyear(current_year)
return HttpResponse(calendar_html)
Регистрация URL-маршрута
В стандартной практике для Django проекта необходимо добавить URL-маршрут для этого представления в основной модуль конфигурации URL проекта. Однако в данном случае мы хотим, чтобы представление было доступно только авторизованным пользователям и отображалось внутри /admin/ URL-пространства, управляемого Wagtail. Это делается через хук register_admin_urls.
При запуске Wagtail ищет wagtail_hooks подмодуль в каждом установленных приложении. В этом подмодуле вы можете определить функции, которые будут выполняться в различные моменты работы Wagtail, такие как создание URL-конфигурации для админки и построение главного меню.
Создайте файл wagtail_hooks.py внутри wagtailcalendar приложения, содержащий следующее:
from django.urls import path
from wagtail.core import hooks
from .views import index
@hooks.register('register_admin_urls')
def register_calendar_url():
return [
path('calendar/', index, name='calendar'),
]
Теперь календарь будет доступен по адресу /admin/calendar/.
Добавление шаблона
В настоящее время это представление выводит фрагмент простого HTML. Давайте вставим его в обычную структуру страницы Wagtail админки, создав шаблон, который расширяет базовый шаблон Wagtail "wagtailadmin/base.html".
Примечание
Базовый шаблон и HTML-структура не считаются стабильной частью API Wagtail и могут измениться в будущих версиях.
Обновите views.py следующим образом:
import calendar
from django.shortcuts import render
from django.utils import timezone
def index(request):
current_year = timezone.now().year
calendar_html = calendar.HTMLCalendar().formatyear(current_year)
return render(request, 'wagtailcalendar/index.html', {
'current_year': current_year,
'calendar_html': calendar_html,
})
Теперь создайте папку templates/wagtailcalendar/ внутри wagtailcalendar приложения, содержащую index.html следующим образом:
{% extends "wagtailadmin/base.html" %}
{% block titletag %}{{ current_year }} calendar{% endblock %}
{% block extra_css %}
{{ block.super }}
<style>
table.month {
margin: 20px;
}
table.month td, table.month th {
padding: 5px;
}
</style>
{% endblock %}
{% block content %}
{% include "wagtailadmin/shared/header.html" with title="Calendar" icon="date" %}
<div class="nice-padding">
{{ calendar_html|safe }}
</div>
{% endblock %}
Здесь мы переопределяем три блока, определённые в базовом шаблоне: titletag (который устанавливает содержимое тега HTML <title>), extra_css (который позволяет нам предоставить дополнительные CSS-стили, специфичные для этой страницы) и content (для основной области содержимого страницы). Мы также включаем стандартный компонент заголовка и устанавливаем заголовок и значок. Список распознаваемых идентификаторов значков см. в Руководстве по стилю пользовательского интерфейса.
Перейдя к /admin/calendar/ вы теперь увидите календарь внутри структуры страницы Wagtail админки.
Добавление пункта меню
Теперь наше представление календаря готово, но нет способа получить к нему доступ из остальной части админского интерфейса. Для добавления пункта в боковое меню мы воспользуемся другим хуком register_admin_menu_item. Обновите wagtail_hooks.py следующим образом:
from django.urls import path, reverse
from wagtail.admin.menu import MenuItem
from wagtail.core import hooks
from .views import index
@hooks.register('register_admin_urls')
def register_calendar_url():
return [
path('calendar/', index, name='calendar'),
]
@hooks.register('register_admin_menu_item')
def register_calendar_menu_item():
return MenuItem('Calendar', reverse('calendar'), icon_name='date')
Теперь в меню появится пункт «Календарь».
Добавление группы пунктов меню
Иногда вы хотите сгруппировать пользовательские представления в один пункт меню в боковом меню. Давайте создадим ещё одно представление, отображающее только текущий месяц календаря:
import calendar
from django.http import HttpResponse
from django.utils import timezone
def index(request):
current_year = timezone.now().year
calendar_html = calendar.HTMLCalendar().formatyear(current_year)
return HttpResponse(calendar_html)
def month(request):
current_year = timezone.now().year
current_month = timezone.now().month
calendar_html = calendar.HTMLCalendar().format_month(current_year, current_month)
return HttpResponse(calendar_html)
Нам также нужно обновить wagtail_hooks.py чтобы зарегистрировать наш URL в админском интерфейсе:
from django.urls import path
from wagtail.core import hooks
from .views import index, month
@hooks.register('register_admin_urls')
def register_calendar_url():
return [
path('calendar/', index, name='calendar'),
path('calendar/month/', month, name='calendar-month'),
]
Теперь календарь будет доступен по адресу /admin/calendar/month/.
Наконец, мы можем изменить наш wagtail_hooks.py чтобы включить группу пользовательских пунктов меню. Это аналогично добавлению одного пункта, но включает импорт двух дополнительных классов, SubMenu и SubmenuMenuItem.
from django.urls import path, reverse
from wagtail.admin.menu import MenuItem, SubmenuMenuItem
from wagtail.contrib.modeladmin.menus import SubMenu
from wagtail.core import hooks
from .views import index, month
@hooks.register('register_admin_urls')
def register_calendar_url():
return [
path('calendar/', index, name='calendar'),
path('calendar/month/', month, name='calendar-month'),
]
@hooks.register('register_admin_menu_item')
def register_calendar_menu_item():
menu_items = [
MenuItem('Calendar', reverse('calendar'), icon_name='date'),
MenuItem('Current month', reverse('calendar-month'), icon_name='date'),
]
return SubmenuMenuItem('Calendar', SubMenu(menu_items), classnames='icon icon-date')
Теперь пункт «Календарь» отобразится как группа пунктов меню.
При раскрытии пункта «Календарь» будут отображаться наши два пользовательских пункта меню.
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v2.16.3/extending/admin_views.html