Spec-Zone.ru › Wagtail 3

Настройка интерфейса редактирования

Настройка вкладок

По умолчанию Wagtail организует панели страниц на три вкладки: «Содержание», «Продвижение» и «Настройки». Для фрагментов Wagtail помещает все панели на одну страницу. В зависимости от потребностей вашего сайта, вы можете настроить это для определенных типов страниц или фрагментов — например, добавив дополнительную вкладку для содержимого сайдбара. Это можно сделать, указав атрибут edit_handler в модели страницы или фрагмента. Например:

from wagtail.admin.panels import TabbedInterface, ObjectList

class BlogPage(Page):
    # field definitions omitted

    content_panels = [
        FieldPanel('title', classname="full title"),
        FieldPanel('date'),
        FieldPanel('body', classname="full"),
    ]
    sidebar_content_panels = [
        FieldPanel('advert'),
        InlinePanel('related_links', label="Related links"),
    ]

    edit_handler = TabbedInterface([
        ObjectList(content_panels, heading='Content'),
        ObjectList(sidebar_content_panels, heading='Sidebar content'),
        ObjectList(Page.promote_panels, heading='Promote'),
        ObjectList(Page.settings_panels, heading='Settings', classname="settings"),
    ])

Форматированный текст (HTML)

Wagtail предоставляет универсальный WYSIWYG-редактор для создания форматированного текста (HTML) и встраивания медиа, таких как изображения, видео и документы. Чтобы включить это в ваши модели, используйте функцию RichTextField при определении поля модели:

from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel


class BookPage(Page):
    body = RichTextField()

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
    ]

RichTextField наследуется от базового поля Django TextField, поэтому вы можете передать любые параметры поля в RichTextField, как если бы вы использовали обычное поле Django. Этому полю не нужна специальная панель, и его можно определить с помощью FieldPanel.

Однако, вывод шаблона из RichTextField специальный и требует фильтрации, чтобы сохранить встроенное содержимое. См. Форматированный текст (фильтр).

Ограничение возможностей в поле форматированного текста

По умолчанию редактор форматированного текста предоставляет пользователям широкий выбор опций для форматирования текста и вставки встроенного контента, такого как изображения. Однако мы можем захотеть ограничить поле форматированного текста более ограниченным набором функций — например:

  • Поле может быть предназначено для краткого фрагмента текста, такого как краткое описание, которое должно быть выделено на страницах индекса, где встроенные изображения или видео будут неуместны;
  • Когда содержимое страницы определяется с помощью StreamField, такие элементы, как заголовки, изображения и видео, обычно получают свои собственные типы блоков, наряду с типом блока форматированного текста, используемого для обычного абзацного текста; в этом случае разрешение заголовков и изображений также существовать внутри форматированного текста избыточно (и может привести к несогласованному дизайну).

Это можно сделать, передав аргумент features функции RichTextField, со списком идентификаторов функций, которые вы хотите разрешить:

body = RichTextField(features=['h2', 'h3', 'bold', 'italic', 'link'])

Идентификаторы функций, предоставляемые по умолчанию в Wagtail, следующие:

  • h1, h2, h3, h4, h5, h6 - элементы заголовков
  • bold, italic - жирный/курсивный текст
  • ol, ul - упорядоченные/неупорядоченные списки
  • hr - горизонтальные линии
  • link - ссылки на страницы, внешние ссылки и ссылки на электронную почту
  • document-link - ссылки на документы
  • image - встроенные изображения
  • embed - встроенные медиа (см. Встроенное содержимое)

У нас также есть несколько дополнительных идентификаторов функций. Они не включены по умолчанию, но вы можете использовать их в вашем списке идентификаторов. Это:

  • code - инлайновый код
  • superscript, subscript, strikethrough - форматирование текста
  • blockquote - блок цитаты

Процесс создания новых функций описан на следующих страницах:

  • Внутренности форматированного текста
  • Расширение редактора Draftail

Форматы изображений в редакторе форматированного текста

При загрузке Wagtail будет искать приложение с файлом image_formats.py и выполнять его содержимое. Это предоставляет способ настройки опций форматирования, отображаемых редактору при вставке изображений в редакторе RichTextField.

В качестве примера, добавьте формат «миниатюра»:

# image_formats.py
from wagtail.images.formats import Format, register_image_format

register_image_format(Format('thumbnail', 'Thumbnail', 'richtext-image thumbnail', 'max-120x120'))

Для начала импортируйте класс Format, функцию register_image_format, и необязательно функцию unregister_image_format. Для регистрации нового Format, вызовите register_image_format с объектом Format в качестве аргумента. Класс Format принимает следующие аргументы конструктора:

Для отмены регистрации вызовите unregister_image_format со строкой name объекта Format в качестве единственного аргумента.

Предупреждение

Отмена регистрации объектов Format приведет к ошибкам при просмотре или редактировании страниц, которые на них ссылаются.

Настройка сгенерированных форм

Wagtail автоматически генерирует формы с использованием настроенных на модели панелей. По умолчанию эта форма наследуется от WagtailAdminModelForm, или WagtailAdminPageForm для страниц. Пользовательский базовый класс формы может быть настроен путем установки атрибута base_form_class в любой модели. Пользовательские формы для фрагментов должны наследоваться от WagtailAdminModelForm, а пользовательские формы для страниц должны наследоваться от WagtailAdminPageForm.

Это можно использовать для добавления полей, не являющихся моделями, в форму, для автоматического заполнения содержимого полей или для добавления пользовательской логики валидации для ваших моделей:

from django import forms
from django.db import models
import geocoder  # not in Wagtail, for example only - https://geocoder.readthedocs.io/
from wagtail.admin.panels import FieldPanel
from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.models import Page


class EventPageForm(WagtailAdminPageForm):
    address = forms.CharField()

    def clean(self):
        cleaned_data = super().clean()

        # Make sure that the event starts before it ends
        start_date = cleaned_data['start_date']
        end_date = cleaned_data['end_date']
        if start_date and end_date and start_date > end_date:
            self.add_error('end_date', 'The end date must be after the start date')

        return cleaned_data

    def save(self, commit=True):
        page = super().save(commit=False)

        # Update the duration field from the submitted dates
        page.duration = (page.end_date - page.start_date).days

        # Fetch the location by geocoding the address
        page.location = geocoder.arcgis(self.cleaned_data['address'])

        if commit:
            page.save()
        return page


class EventPage(Page):
    start_date = models.DateField()
    end_date = models.DateField()
    duration = models.IntegerField()
    location = models.CharField(max_length=255)

    content_panels = [
        FieldPanel('title'),
        FieldPanel('start_date'),
        FieldPanel('end_date'),
        FieldPanel('address'),
    ]
    base_form_class = EventPageForm

Wagtail сгенерирует новый подкласс этой формы для модели, добавив любые поля, определенные в panels или content_panels. Любые поля, уже определенные в модели, не будут перезаписаны этими автоматически добавленными полями, поэтому поле формы для поля модели может быть переопределено путем добавления его в пользовательскую форму.

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

Spec-Zone.ru

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