Настройка интерфейса редактирования
Настройка вкладок
По умолчанию 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— блок цитаты
Процесс создания новых функций описан на следующих страницах:
Вы также можете указать настройку для наименования группы функций форматированного текста. См. 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