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