Введение
В Odoo вся информация о бизнесе хранится в моделях — это шаблоны, которые описывают структуру и место хранения данных в базе. Любая сущность, с которой вы работаете — товар, заказ, страница сайта — представлена моделью.
Понимание моделей Odoo важно и для разработчиков, и для бизнес-аналитиков: именно модели задают поля, связи и встроенную логику, на которых строится вся система.
В этой статье мы сосредоточимся на модели website.page — она отвечает за статические страницы сайта в Odoo. Если вы делаете лендинги, редактируете контент или интегрируете сайт с внешними сервисами, вам придётся работать с этой моделью.
Что такое модель website.page
Модель website.page представляет статические страницы сайта в приложении Website. Сюда попадают страницы, создаваемые через конструктор: «О компании», «Контакты», отдельные лендинги и др.
Технически website.page использует наследование моделей Odoo: записи связаны с ir.ui.view через механизм _inherits. Каждая страница хранит ссылку на view, где лежит QWeb-шаблон (arch) и метаданные.
Динамический контент — разделы магазина, ленты блога и похожие — формируется иначе и не завязан напрямую на website.page.
Такие динамические страницы не сохраняются как записи website.page. Эта модель предназначена именно для статических страниц, которые вы создаёте и редактируете через визуальный редактор.
Ключевые поля модели
Ниже перечислены важнейшие поля website.page, которые полезно знать при работе с контентом и настройкой сайта.
1. name
Тип: Char. Заголовок страницы — тот текст, что попадает в таб браузера, меню и результаты поиска. Значение берётся из связанного ir.ui.view.
2. url
Тип: Char. Путь страницы в URL. Должен начинаться со слэша, например /contact, /about-us — именно по этому пути посетители попадают на страницу.
3. view_id
Тип: Many2one (ir.ui.view). Обязательное поле. Указывает на QWeb-view с содержимым страницы. Представление хранит arch (XML) и key. При удалении представления запись страницы удаляется каскадно.
4. website_id
Тип: Many2one (website). Сайт, которому принадлежит страница. В мультисайтовых установках страницы могут привязываться к конкретному сайту или быть общими (когда поле пусто).
5. is_published
Тип: Boolean. Отвечает за видимость страницы для посетителей. Снятая с публикации страница возвращает 404 или делает редирект — удобно скрывать контент без удаления.
6. website_indexed
Тип: Boolean. Управляет индексацией страницы поисковиками. Для страниц благодарности или внутренних материалов ставьте False, чтобы они не появлялись в результатах поиска.
7. date_publish
Тип: Datetime. Дата и время публикации. Используется для отложенного выпуска контента и отображения даты публикации.
8. header_visible
Тип: Boolean. Показ шапки сайта на этой странице. Полезно для лендингов и страниц с полноэкранными баннерами, где шапка мешает дизайну.
9. footer_visible
Тип: Boolean. Показ футера. Как и header_visible, позволяет создавать страницы без стандартного нижнего блока.
10. is_homepage
Тип: Boolean. Вычисляемое поле. Истина, если страница назначена главной. На каждый сайт может быть только одна главная страница.
11. is_visible
Тип: Boolean. Вычисляемое поле, показывающее, доступна ли страница исходя из статуса публикации, даты и правил видимости.
12. menu_ids
Тип: One2many (website.menu). Пункты меню, ссылающиеся на эту страницу. Одна страница может присутствовать в нескольких меню или ни в одном.
13. create_date
Тип: Datetime. Когда запись была создана. Поле заполняется автоматически и полезно для аудита и отчётности.
14. write_date
Тип: Datetime. Когда запись была в последний раз изменена. Тоже заполняется системой — помогает отслеживать обновления контента.
15. arch
Тип: Text. QWeb-шаблон в XML — хранится в связанном ir.ui.view. Содержит HTML-структуру и сниппеты Odoo, редактируется через конструктор сайта.
16. key
Тип: Char. Уникальный идентификатор представления. Используется в XML-модулях и при наследовании. Обычно имеет формат module.view_name.
17. type
Тип: Selection. Тип представления. Для страниц сайта это всегда qweb. Другие варианты — form, list, tree и т.д.
18. active
Тип: Boolean. Флаг «мягкого удаления». Когда False — запись архивируется и не отдаётся посетителям. Поле приходит из ir.ui.view.
19. website_meta_title
Тип: Char. SEO-заголовок страницы. Перекрывает стандартный title в результатах поиска — важно для видимости в поисковиках.
20. website_meta_description
Тип: Text. SEO-описание, которое показывается в выдаче. Рекомендуется держать в пределах 150–160 символов для корректного отображения.
21. website_meta_keywords
Тип: Char. Ключевые слова. Сейчас имеют меньше веса для SEO, но иногда используются внешними системами — вводите через запятую.
22. header_overlay
Тип: Boolean. Накладывать ли шапку поверх содержимого. Применяется для hero-блоков, где шапка размещается поверх баннера.
23. header_color
Тип: Selection. Схема цвета шапки — например transparent, light, dark. Влияет на контрастность и читаемость элементов.
24. visibility
Тип: Selection. Настройки доступа: Public, Signed In, Restricted Group, With Password. Определяет, кто может просматривать страницу.
25. redirect_type
Тип: Selection. Тип редиректа при смене URL: 301 (постоянный), 302 (временный) или None. Ключевой момент для сохранения SEO-параметров при переезде страниц.
Как модель используется в бизнес-процессах
1. Лендинги и маркетинговые кампании
Маркетологи используют website.page для создания лендингов кампаний. Каждая посадочная страница — отдельная запись: здесь задают URL, содержимое и дату публикации; отложенная публикация делается через date_publish.
2. Корпоративные страницы
Страницы «О компании», «Контакты», правила и политики обычно хранятся как website.page: их создают один раз и обновляют по мере необходимости; размещение в меню настраивается через menu_ids.
3. Страницы благодарности и подтверждения
Страницы типа «Форма отправлена» лучше делать website.page и отключать индексацию (website_indexed=False), чтобы они не попадали в поисковую выдачу.
4. Мультисайтовость и локализация
В мультисайтовых решениях поле website_id определяет, на каком сайте показывать страницу; при необходимости страницы дублируют и локализуют под каждый сайт.
5. Закрытый доступ и gated-контент
Поле visibility позволяет делать страницы только для авторизованных пользователей или для определённых групп — удобно для закрытых разделов и внутренней документации.
Как разработчики расширяют эту модель
Разработчики расширяют website.page несколькими стандартными способами. Основной инструмент — наследование моделей Odoo.
Наследование модели
В модуле используйте _inherit = 'website.page', чтобы добавить поля, переопределить методы или ввести новые ограничения. Такой подход сохраняет изменения в отдельном модуле и упрощает апгрейды.
Добавление полей
Объявляйте дополнительные поля в унаследованной модели, подбирая корректный тип: Char, Many2one, Boolean, Integer, Text, Selection. Для мультисайтовых данных учитывайте поддержку website-dependent полей.
Расширения на Python
Переопределяйте методы create, write, unlink, добавляя свою логику, но не забывайте вызывать super(). Будьте внимательны с полем view_id и каскадным удалением представлений.
Odoo Studio
Odoo Studio подходит для быстрой донастройки страниц и верстки без кода. Но для сложной логики, интеграций и поддержки через API лучше писать собственные модули.
Рекомендации и правила работы
- Используйте человекопонятные слаги в URL: без пробелов и специальных символов, с дефисами между словами для читаемости и SEO.
- Отключайте индексацию (website_indexed=False) для страниц благодарности, подтверждений и внутренних материалов.
- При смене URL обязательно настраивайте редирект (301 или 302), чтобы не потерять SEO-позиции и не допускать битых ссылок.
- Заполняйте website_meta_title и website_meta_description для публичных страниц — это прямо влияет на видимость в поисковых системах.
- Если создаёте страницы через API или XML-RPC, сначала создайте ir.ui.view, затем сайт-страницу с view_id. Убедитесь, что view имеет type = qweb и уникальный key.
Типичные ошибки
- Создание website.page без действительного view_id. Представление должно существовать и иметь тип qweb — иначе страница не будет корректно работать.
- Использование URL без начального слэша. Odoo ожидает путь вида /contact, а не contact — иначе маршрутизация не сработает.
- Забыть отключить индексацию для thank-you-страниц. Такие страницы могут попасть в выдачу и испортить релевантность сайта.
- Смена URL без настройки редиректа. Старые ссылки перестают работать, а поисковые системы теряют связь с контентом.
- Изменение arch у представления, которое редактировалось через конструктор. Флаг noupdate в ir.model.data может блокировать применение XML-изменений — при необходимости сбросьте его.
Итоги
Модель website.page — центральный элемент для управления статическими страницами в Odoo: она хранит метаданные, URL и настройки публикации, а само содержимое лежит в связанном ir.ui.view.
Разобравшись в полях модели и её наследовании от ir.ui.view, вы сможете лучше настраивать, расширять и интегрировать сайты на Odoo. Это знание сэкономит время и сократит число ошибок как для консультантов, так и для разработчиков.
Нужна помощь с внедрением Odoo?
Компания Dasolo помогает предприятиям внедрять, настраивать и оптимизировать Odoo. Мы специализируемся на интеграциях через API и разработке под Odoo, глубоко понимая архитектуру данных и модели вроде website.page.
Если вам нужна поддержка по внедрению Odoo, созданию кастомных страниц или интеграциям — мы готовы помочь. Записаться на демонстрацию чтобы обсудить ваш проект.