Теория
Введение в деревья
Если вы не знакомы с деревьями как абстрактным типом данных, вы можете ознакомиться с соответствующими концепциями.
Однако, как веб-разработчик, вы, вероятно, уже хорошо понимаете деревья как каталоги файловой системы или пути. Страницы Wagtail могут создавать ту же структуру, так как каждая страница в дереве имеет свой собственный URL-путь, например:
/
people/
nien-nunb/
laura-roslin/
events/
captain-picard-day/
winter-wrap-up/
Интерфейс Wagtail администрирования использует дерево для организации контента для редактирования, позволяя вам перемещаться вверх и вниз по уровням дерева через меню «Обзор». Этот метод организации — хорошее начало для размышлений о собственных моделях Wagtail.
Узлы и листья
Возможно, будет полезно рассматривать модели, которые вы хотите создать, как производные от Page и как один из двух типов узлов: родительские и листья. Wagtail не навязывает этот подход, но это хорошее начало, если вы не опытны в структурировании собственных типов контента.
Узлы
Родительские узлы в дереве Wagtail, вероятно, захотят организовать и отобразить просматриваемый индекс своих потомков. Например, блог нуждается в способе отображения списка отдельных записей.
Родительский узел может предоставить собственную функцию, возвращающую объекты потомков.
class EventPageIndex(Page):
# ...
def events(self):
# Get list of live event pages that are descendants of this page
events = EventPage.objects.live().descendant_of(self)
# Filter events list to get ones that are either
# running now or start in the future
events = events.filter(date_from__gte=date.today())
# Order by date
events = events.order_by('date_from')
return events
В этом примере гарантируется, что возвращаемые объекты ограничены частями контента, которые имеют смысл, в частности, теми, которые были опубликованы через интерфейс администрирования Wagtail (live()) и являются потомками этого узла (descendant_of(self)). Установив свойство класса subpage_types, вы можете указать, какие модели разрешено устанавливать в качестве потомков, а установив свойство класса parent_page_types, вы можете указать, какие модели разрешено устанавливать в качестве родителей этой модели страницы. Wagtail по умолчанию разрешит любую модель, производную от Page. Независимо от этого, для родительской модели разумно предоставить индекс, отфильтрованный для осмысленности.
Листья
Листья — это сами фрагменты контента, страница, которая потребляется и, возможно, состоит из набора свойств. Лист страницы блога может содержать некоторый текст тела и изображение. Лист страницы человека может содержать фото, имя и адрес.
Для листа может быть полезно предоставить способ возвращения вверх по дереву к родителю, например, в случае навигации по хлебным крошкам. Дерево также может быть достаточно глубоким, чтобы родитель листа не включался в общую навигацию по сайту.
Модель листа может предоставить функцию, которая проходит по дереву в обратном направлении и возвращает соответствующего предка:
class EventPage(Page):
# ...
def event_index(self):
# Find closest ancestor which is an event index
return self.get_ancestors().type(EventIndexPage).last()
Если определены subpage_types и parent_page_types, они также ограничат модели родителей, которые могут содержать лист. Если нет, Wagtail разрешит любое сочетание родителей и листьев для ассоциации в дереве Wagtail. Как и в случае с индексными страницами, рекомендуется убедиться, что индекс фактически содержит ожидаемую модель, содержащую лист.
Другие отношения
Ваши модели, производные от Page, могут иметь другие взаимосвязи, которые расширяют базовое дерево Wagtail или полностью от него отличаются. Вы можете предоставить функции для навигации между братьями и сестрами, например, ссылку «Следующая запись» на странице блога (post->post->post). Поддеревья могут иметь смысл, например, в форуме обсуждения (forum->post->replies). Переход по иерархии может оказаться полезным, поскольку все объекты определенного класса моделей могут взаимодействовать независимо от своих предков (events = EventPage.objects.all). В основном модели определяют свои взаимосвязи, возможности действительно безграничны.
Архитектура запроса Wagtail
Для выхода за рамки основ определения модели и взаимоотношений может быть полезно знать, как Wagtail обрабатывает запросы и строит ответы. Короче говоря, происходит примерно следующее:
- Django получает запрос и маршрутизирует его через определения диспетчера URL Wagtail.
- Wagtail проверяет имя хоста запроса, чтобы определить, какой
Siteзапись будет обрабатывать этот запрос. - Начиная с корневой страницы этого сайта, Wagtail проходит по дереву страниц, вызывая метод
route()и позволяя каждой модели страницы решить, обработает ли она сама запрос или передаст его дочерней странице. - Страница, ответственная за обработку запроса, возвращает объект
RouteResultизroute(), который идентифицирует страницу вместе с любыми дополнительнымиargs/kwargs, которые необходимо передать вserve(). - Wagtail вызывает
serve(), который строит контекст с помощьюget_context(). -
serve()находит шаблон для передачи его с помощьюget_template() - Объект ответа возвращается
serve()и Django отвечает запрошающему.
Вы можете применить пользовательское поведение к этому процессу, переопределив методы класса Page такие как route() и serve() в собственных моделях. Примеры см. в Рецептах.
Планируемое опубликование
Опубликование страниц можно планировать с помощью функции «Дата/время публикации» во вкладке «Настройки» на странице «Редактировать». Это позволяет вам настроить начальное опубликование страницы или обновление страницы заранее. Для публикации страниц в запланированное время вы должны настроить команду управления publish_scheduled_pages.
Основной рабочий процесс следующий:
- Планирование пересмотра страницы, которая в данный момент не активна, означает, что страница будет опубликована, когда придёт запланированное время.
- Планирование пересмотра страницы, которая уже активна, означает, что этот пересмотр будет опубликован, когда придёт запланированное время.
- Если у страницы запланирован пересмотр, и вы установите другой пересмотр для немедленного опубликования, запланированный пересмотр будет отменён.
В представлении «Пересмотры» для данной страницы будет показано, какой пересмотр запланирован и когда он запланирован. Запланированный пересмотр в списке также предоставит кнопку «Отменить планирование», чтобы отменить его.
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/reference/pages/theory.html