Spec-Zone.ru › Wagtail 2

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

Наиболее распространённое использование пользовательских представлений в админке 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/.

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.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')

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

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

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.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')

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

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'.
  • Предыдущая Расширение Wagtail
  • Следующая Компоненты шаблонов

Содержание страницы

  • Создание админских представлений
    • Определение представления
    • Регистрация URL-маршрута
    • Добавление шаблона
    • Добавление пункта меню
    • Добавление группы пунктов меню

© 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

Spec-Zone.ru

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