Spec-Zone.ru › Wagtail

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

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

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

from wagtail.admin.panels import TabbedInterface, ObjectList

class BlogPage(Page):
    # field definitions omitted

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

    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'),
    ])

Форматированный текст (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'),
    ]

RichTextField наследуется от базового поля Django TextField, поэтому вы можете передавать любые параметры поля в RichTextField, как если бы вы использовали обычное поле Django. Его max_length проигнорирует любые форматирования форматированного текста. Для этого поля не требуется специальная панель, и его можно определить с помощью 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

Вы также можете указать настройку для наименования группы функций форматированного текста. См. WAGTAILADMIN_RICH_TEXT_EDITORS.

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

При загрузке 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 принимает следующие аргументы конструктора:

name
Уникальный ключ, используемый для идентификации формата. Чтобы отменить регистрацию этого формата, вызовите unregister_image_format с этой строкой в качестве единственного аргумента.

label
Название, используемое в форме выбора при вставке изображения в редактор RichTextField.

classnames
Строка, которая будет назначена атрибуту class созданного тега <img>.

Примечание

Любые имена классов, которые вы предоставите, должны иметь соответствующие CSS-правила, написанные отдельно, как часть кода CSS фронта. Указание значения classnames как left гарантирует, что класс будет выведен в сгенерированной разметке, но не вызовет выравнивание изображения по левому краю.

filter_spec
Спецификация строки для создания представления изображения. Подробнее см. Как использовать изображения в шаблонах.

Для отмены регистрации вызовите 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/stable/advanced_topics/customisation/page_editing_interface.html

Spec-Zone.ru

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