Spec-Zone.ru › Wagtail

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

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

Для других типов админских представлений, которые не соответствуют этому шаблону, можно написать собственные представления 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. Это делается с помощью хука Зарегистрировать URL админки.

При запуске 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

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

Наше представление календаря теперь готово, но нет способа перейти к нему из остальной части админского интерфейса. Для добавления пункта в боковое меню мы используем другой хук Зарегистрировать пункт меню админки. Обновите 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.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,
    })

def month(request):
    current_year = timezone.now().year
    current_month = timezone.now().month
    calendar_html = calendar.HTMLCalendar().formatmonth(current_year, current_month)

    return render(request, 'wagtailcalendar/index.html', {
        'current_year': current_year,
        'calendar_html': 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 calender month

Наконец, мы можем изменить wagtail_hooks.py, чтобы включить группу пользовательских пунктов меню. Это аналогично добавлению одного пункта, но включает импорт двух дополнительных классов Menu и SubmenuMenuItem.

from django.urls import path, reverse

from wagtail.admin.menu import Menu, MenuItem, SubmenuMenuItem
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():
    submenu = Menu(items=[
        MenuItem('Calendar', reverse('calendar'), icon_name='date'),
        MenuItem('Current month', reverse('calendar-month'), icon_name='date'),
    ])

    return SubmenuMenuItem('Calendar', submenu, icon_name='date')

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

Wagtail admin sidebar menu, showing an expanded "Calendar" group menu item with a date icon, 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/stable/extending/admin_views.html

Spec-Zone.ru

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