Настройка интерфейса редактирования
Настройка интерфейса вкладок
По умолчанию Wagtail организует панели для страниц на трех вкладках: «Содержание», «Продвижение» и «Настройки». Для фрагментов Wagtail помещает все панели на одну страницу. В зависимости от требований вашего сайта, вы можете настроить это для определенных типов страниц или фрагментов — например, добавив дополнительную вкладку для содержимого боковой панели. Это можно сделать, указав атрибут edit_handler в модели страницы или фрагмента. Например:
from wagtail.admin.edit_handlers 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 = [
SnippetChooserPanel('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.core.fields import RichTextField
from wagtail.admin.edit_handlers 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— блок цитаты
Процесс создания новых функций описан на следующих страницах:
Форматы изображений в редакторе форматированного текста
При загрузке 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.edit_handlers import FieldPanel
from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.core.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/v2.16.3/advanced_topics/customisation/page_editing_interface.html