Spec-Zone.ru › Wagtail 3

Создание админских представлений

Наиболее распространённое использование пользовательских представлений в админ-панели Wagtail — предоставление интерфейса для управления моделью Django. Приложение ModelAdmin упрощает эту задачу, предоставляя готовые представления для отображения, создания и редактирования объектов с минимальной настройкой.

Для других типов админских представлений, которые не подходят под эту модель, вы можете написать собственные представления Django и зарегистрировать их как часть админ-панели Wagtail через хуки. В этом примере мы реализуем представление, отображающее календарь на текущий год, используя модуль calendar из стандартной библиотеки Python.

Определение представления

В проекте Wagtail создайте новую wagtailcalendar приложение с ./manage.py startapp wagtailcalendar и добавьте его в INSTALLED_APPS вашего проекта. (В этом случае мы используем имя «wagtailcalendar», чтобы избежать конфликта со стандартным модулем 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-адресов верхнего уровня вашего проекта. Однако в этом случае мы хотим, чтобы представление было доступно только авторизованным пользователям и отображалось в пространстве имён URL /admin/, которое управляется Wagtail. Это делается через хук register_admin_urls.

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

Создайте файл wagtail_hooks.py в приложении wagtailcalendar с содержанием:

from django.urls import path
from wagtail import hooks

from .views import index


@hooks.register('register_admin_urls')
def register_calendar_url():
    return [
        path('calendar/', index, name='calendar'),
    ]

Календарь теперь будет доступен по адресу /admin/calendar/.

A calendar, presented in unstyled HTML

Добавление шаблона

В настоящее время это представление выводит обычный фрагмент 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.

A calendar, shown within the Wagtail admin interface

Добавление пункта меню

Наше представление календаря теперь готово, но нет способа добраться до него из остальной части админ-панели. Для добавления пункта в боковое меню мы будем использовать ещё один хук, register_admin_menu_item. Обновите wagtail_hooks.py следующим образом:

from django.urls import path, reverse

from wagtail.admin.menu import MenuItem
from wagtail 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')

В меню теперь появится пункт «Календарь».

Wagtail admin sidebar menu, showing a "Calendar" menu item with a date icon

Добавление группы пунктов меню

Иногда вы хотите сгруппировать пользовательские представления вместе в один пункт меню в боковой панели. Давайте создадим ещё одно представление, отображающее только текущий месяц календаря:

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 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/.

A single 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 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')

Пункт «Календарь» теперь отобразится как группа пунктов меню.

Wagtail admin sidebar menu, showing a "Calendar" group menu item with a date icon

При раскрытии пункта «Календарь» будут показаны наши два пользовательских пункта меню.

Wagtail admin sidebar 'Calendar' menu expaned, showing two child menu items, 'Calendar' and 'Month'.

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/extending/admin_views.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API