Перейти к содержимому

Поля Context в Odoo: Практическое руководство

Разберитесь, как окружение влияет на поведение полей, значения по умолчанию и фильтрацию записей в Odoo ORM
6 марта 2026 г. от
Поля Context в Odoo: Практическое руководство
Dasolo
| Комментариев пока нет

Если вы когда-либо настраивали формы, работали с ORM или правили XML-вьюхи в Odoo, вы наверняка натыкались на слово «context». Оно встречается в описании полей, в атрибутах вьюх и в Python-коде системы. Для многих это как черный ящик: работает — и хорошо, но как только что-то ломается, становится ясно, что понимания механизма не хватает.


Разобраться с контекстом важно не ради теории: от него зависит, какие значения подставляются в формы, какие записи видит пользователь, и как рассчитываются вычисляемые поля. Правильно настроенный контекст экономит часы дебага — будь то простая доработка интерфейса или разработка целого модуля.


В этой заметке мы разберём, что такое контекст в Odoo, как он передаётся по фреймворку и как использовать его в реальных проектах, чтобы интерфейс работал интуитивно и предсказуемо.

Что такое контекст в Odoo


Контекст в Odoo — это обычный Python-словарь, который сопровождает запрос, вызов метода или операцию с записью. Это не отдельный тип поля — вы не найдёте чего-то вроде fields.Context() в ORM. Контекст — это механизм влияния на поведение приложений и полей.


Проще всего представить контекст как невидимый набор инструкций рядом с данными: «подставь это значение по умолчанию», «покажи также архивные записи», «используй перевод на этот язык», «применяй такой-то фильтр в выпадающем списке» — всё это передаётся через контекст.


Где встречается контекст

Контекст появляется в трёх ключевых местах внутри модели данных Odoo:

  • В определениях полей в Python: параметр context для реляционных полей — Many2one, One2many, Many2many.
  • In XML view attributes: The context attribute on <field> tags in form, list, and kanban views.
  • В окружении ORM: доступ через self.env.context в Python и возможности модификации через self.with_context(key=value).

Во всех этих местах контекст выполняет одну и ту же роль: он несёт дополнительную информацию, которая меняет поведение поля или записи во время выполнения.

Как контекст действует внутри модели данных Odoo


Контекст проходит весь жизненный цикл запроса — от открытия формы пользователем до сохранения записи. Ниже — основные механизмы его работы на практике.


Подставка значений по умолчанию через default_*

Частый и простой приём — использование ключей с префиксом default_. Такие ключи говорят Odoo автоматически заполнить поле при создании новой записи.

Например, если при открытии формы заказа продажи через кнопку в контексте передаётся {"default_partner_id": 42}, поле покупателя уже будет заполнено партнёром с ID 42. Пользователь увидит готовую форму без дополнительного кода на Python.


Этот паттерн широко применяют в разработке Odoo, чтобы сделать переходы между записями более предиктивными и удобными.


Атрибут context на реляционных полях

При описании Many2one/One2many/Many2many в Python можно указать параметр context. Он используется каждый раз, когда поле загружает или создаёт связанные записи через всплывающие окна или выпадающие списки.


Практический пример: Many2one на res.partner с context={"default_is_company": True} — при создании партнёра из этого поля чекбокс «Компания» будет уже отмечен. Вы подсказываете пользователю правильное значение, не устанавливая принудительное ограничение.


Контекст в XML-вьюхах

In view XML, the context attribute on a field tag works the same way, but it can be dynamic. You can reference other field values using Odoo's evaluation syntax:


Это даёт возможность строить «умные» формы: значение контекста одного поля зависит от значения другого. Именно так в Odoo делают поведение полей более интуитивным без лишней серверной логики.


Чтение и изменение контекста в Python

Внутри метода модели текущий контекст доступен через self.env.context — это полный словарь в том состоянии, в котором был при вызове метода.


Чтобы выполнить код с изменённым контекстом, применяют self.with_context(key=value). Так вы получаете новый recordset с обновлённым контекстом, не трогая исходный — безопасный и чистый подход, соответствующий функциональной философии Odoo.


Встроенные ключи контекста

Сам Odoo использует ряд зарезервированных ключей, которые меняют поведение фреймворка в разных сценариях:


  • lang — переключает язык для переводимых значений полей.
  • active_test — при значении False включает архивные записи в результаты поиска.
  • no_recompute — запрещает перерасчёт хранимых вычисляемых полей.
  • mail_notrack — отключает трекинг изменений в chatter при записи.
  • allowed_company_ids — управляет видимостью записей в мультикомпанийной среде.
  • bin_size — возвращает размер файла вместо двоичного содержимого для полей Binary.

Знание этих ключей — обязательная часть арсенала Odoo-разработчика, потому что с их помощью многие вещи можно сделать без кастомной логики.

Практические бизнес-сценарии


Контекст полезен не только разработчикам — он решает реальные задачи бизнес-процессов. Ниже — типичные примеры из реальных внедрений Odoo.


1. CRM: автозаполнение торговой команды в новых лидах

Менеджер работает в канбане своей команды и кликает «Новый». Ожидание — лид автоматически привязан к его команде. Если действие передаёт default_team_id в контексте, поле команды уже заполнено при открытии формы — меньше ошибок и быстрее ввод данных.


2. Продажи: предустановка прайс-листа по сегменту клиента

При создании коммерческого предложения из представления, отфильтрованного по категории клиентов, можно подставить default_pricelist_id в контекст. Продавцу подсказывают правильную прайс‑листы, но не лишают свободы выбора.


3. Склад: ограничение локаций в форме перемещения

В операциях склада поле «Источник» в форме перемещения можно ограничить контекст‑доменом, чтобы показывать только локации конкретного склада. Это упрощает интерфейс и снижает риск ошибок при работе с несколькими площадками.


4. Бухгалтерия: строки счёта на языке клиента

При выставлении счета иностранному покупателю ключ lang в контексте заставит описания товаров и названия отображаться на языке клиента, даже если база хранит данные на другом языке.


5. Кастомные модели: показ архивных товаров в специальном представлении

Операционный отдел хочет видеть и отключённые товары вместе с активными. Достаточно задать active_test: False в контексте действия — и в этом специфичном списке появятся все записи, не трогая остальные вьюхи.

Как задать и кастомизировать контекст для полей


Добавить или изменить контекст для полей можно двумя способами: через Odoo Studio без кода для простых настроек или технически — через Python и XML для полной гибкости. Это важная часть любого технического руководства по поведению полей в Odoo.


Использование Odoo Studio

Studio позволяет менять свойства полей без программирования. Для реляционных полей в нём есть опция задать контекст с подстановкой значений, которые применяются при создании записи из этого поля.


Подходит для простых случаев: подставить компанию, команду, категорию или ответственного. Но Studio целенаправленно упрощает контекст: для динамических выражений, ссылающихся на другие поля, понадобится правка XML или Python.


Учтите: контекст, заданный в Studio, сохраняется в конкретной вьюхе. Если позже вы добавите техническое расширение той же вьюхи, предыдущий Studio‑контекст может вступить в конфликт — проверьте существующие настройки перед доработкой.


Определение контекста в Python

В собственном модуле контекст задают прямо в описании поля. Для Many2one параметр context принимает статический словарь:


Такой статический контекст применяется всегда при загрузке или создании связанных записей и не меняется в зависимости от других полей текущей записи. Если нужен реактивный контекст, переносите логику в вьюху.


Определение контекста в XML-вьюхах

В XML контекст передаётся как строка, которую Odoo вычисляет во время рендеринга. Можно ссылаться на значения полей, uid — ID текущего пользователя, active_id и другие переменные окружения:

Благодаря этому контекст на уровне вьюх гораздо гибче, чем в описании поля. Это стандартный инструмент фреймворка для создания форм, где поведение одного поля зависит от другого, и он помогает сделать интерфейс естественным для пользователей.


Передача контекста через window actions

Контекст также хранится в записях ir.actions.act_window. Меню и кнопки добавляют свой контекст в действие: он сливается с сессионным контекстом при загрузке представления.


Такой подход удобен, когда нужно разные дефолты в разных местах навигации — контекст живёт на действии, а не в моделе, поэтому можно менять поведение без правки кода модели.

Рекомендации по использованию


Работать с контекстом становится проще, если вы выработаете несколько привычек. Они применимы как при создании модулей, так и при быстрых доработках интерфейса.


  • Используйте контекст как подсказку, а не как принуждение. Контекст удобен для рекомендованных значений — если вам нужен жёсткий запрет, применяйте domain, SQL‑ограничения или onchange‑логику.
  • Динамический контекст размещайте в вьюхах, а не в описании полей. Поле‑уровень даёт только статический словарь; если нужно учитывать состояние текущей записи — делайте это в XML.
  • Всегда применяйте with_context(), а не пытайтесь мутировать self.env.context. Среда Odoo рассчитана на иммутабельность в пределах одного вызова, поэтому with_context() создаёт новый безопасный контекст.
  • Передавайте в контексте только то, что действительно нужно. Ключи накапливаются по стеку вызовов — лишние параметры могут неожиданно повлиять на чужой код, который их проверяет.
  • Используйте контекст для флагов управления потоком. Частая практика — передавать булевы флаги вроде from_wizard: True и проверять их в compute/onchange, чтобы отличать поведение в разных сценариях и не засорять модель служебными полями.
  • Документируйте собственные ключи контекста в модуле. Контекст невидим для интерфейса — оставьте комментарий или docstring о том, какие ключи вы используете и почему; это облегчит поддержку позже.

Типичные ошибки и подводные камни


Ошибки, связанные с контекстом, часто трудно найти, потому что он невидим в UI. Вот наиболее распространённые промахи, которые встречаются на практике.


Приравнивание default_* к обязательным значениям

Значение, заданное через default_* в контексте, применяется только при создании записи через форму. Если вы создаёте записи программно через ORM без передачи контекста, такое значение не подставится. Разработчики иногда ожидают, что контекст‑дефолты будут работать как Python‑параметр default на поле — это не так. При создании записей в коде явно передавайте нужный контекст.


Прямое изменение словаря контекста

Словарь контекста разделяется по стеку вызовов. Если вы начнёте менять self.env.context напрямую, можете непреднамеренно повлиять на остальной код в той же транзакции. Правильный способ — self.with_context(new_key=value), который клонирует контекст и добавляет изменения.


Передача слишком большого количества данных в контексте

Каждый ключ идёт дальше по цепочке вызовов. Некоторые методы Odoo смотрят на специфические ключи и изменяют своё поведение. Неожиданные ключи могут активировать нежелательные ветки логики — держите контекст минимальным и релевантным задаче.


Забывание про active_test при поиске архивных записей

По умолчанию search() и search_read() исключают архивные записи (active = False). Если вам нужно работать с архивом, нужно явно передать active_test: False в контексте. Это частая причина багов в кастомизациях склада и каталога товаров.


Конфликты контекста между Studio и кодом

Если Studio уже задала контекст в вьюхе, а вы позже добавили техническое расширение XML на то же поле, оба контекста могут конфликтовать или один перезапишет другой в зависимости от порядка слияния XML. Перед добавлением своего контекста проверьте, нет ли существующего, особенно при смешении Studio‑правок и модульных кастомизаций.

Итоги


Контекст — мощный, но невидимый инструмент в Odoo. Поняв, как он течёт через определения полей, атрибуты вьюх и окружение ORM, вы получите тонкий контроль над поведением модели данных.


Основные тезисы просты: используйте default_* для мягких подсказок пользователю; динамический контекст держите в вьюхах; всегда работайте через with_context(), а не меняя контекст на месте; и не перегружайте контекст лишними ключами, чтобы не вмешиваться в логику других частей системы.

Будь вы на шаге изучения Odoo‑полей, пишете модуль или ищете причину странного поведения поля, понимание контекста почти всегда даст ответ и путь к решению.


В компании Dasolo мы помогаем внедрять, настраивать и оптимизировать Odoo под реальные бизнес‑процессы. Если вы настраиваете функционал с использованием контекста и сомневаетесь в правильности подхода — мы готовы проконсультировать и помочь внедрить оптимальное решение.

Свяжитесь с нашей командой через страницу контактов и расскажите, что вы хотите реализовать. Мы работаем с компаниями любого размера, чтобы Odoo приносил ожидаемый эффект.

Поля Context в Odoo: Практическое руководство
Dasolo 6 марта 2026 г.
Поделиться этой записью
Войти оставить комментарий