Вступление
Если вы когда‑нибудь загружали фото товара, ставили логотип компании или добавляли фото сотрудника в карточку — вы уже пользовались полем изображения в Odoo. Это один из самых заметных типов полей в системе: картинки попадают в витрину, в карточки клиента и в мобильные экраны сотрудников, даже если пользователи не всегда задумываются о том, как они хранятся.
Для рядового пользователя всё выглядит просто: нажал «загрузить» — картинка появилась. Но для консультанта или разработчика под капотом происходят важные вещи: Odoo управляет хранением, автоматически меняет размер и применяет правила доступа. Понимание этих механизмов помогает принять правильные архитектурные решения при добавлении изображений в кастомные модели.
В этом материале я объясню, что именно хранит поле изображения, как система обрабатывает картинку, как добавить поле через Studio и через код, и приведу примеры реальных рабочих сценариев, где такие поля приносят пользу.
Что такое поле Image в Odoo
В ORM Odoo есть специальный тип поля для картинок — fields.Image, который появился в Odoo 13. До этого использовали fields.Binary вместе с виджетом image. Сейчас fields.Image сама по себе отвечает за приём, хранение и первичную обработку изображений, упрощая жизнь разработчикам.
Технически изображение хранится в виде бинарных данных в base64. В базе PostgreSQL это либо bytea‑поле, либо — чаще в современных установках — содержимое сохраняется как отдельная вложенная запись в ir.attachment. Такой подход разгружает основные таблицы и позволяет отдавать картинки по специальным URL без загрузки больших бинарных полей при каждом запросе.
Как это выглядит в интерфейсе
В форме поле изображения отображается как кликабельный плейсхолдер с предпросмотром: можно загрузить файл с компьютера или в некоторых случаях вставить ссылку. Миниатюра сразу видна в карточке, поэтому визуально найти запись гораздо проще.
В табличных представлениях изображения обычно не показывают — миниатюры тормозят загрузку. Зато в канбане или карточках каталога маленькие фото уместны: они помогают быстро ориентироваться в списке товаров, партнёров или задач.
Image против Binary: в чём разница
Важно не путать два типа. Binary — универсальное поле для любых файлов (PDF, ZIP, XLS и т. п.). Image — специализировано под графику: применяет валидацию, автоматическое изменение размера и корректно рендерится виджетом image. Для фото и логотипов выбирайте Image; для документов — Binary.
Как это поле работает
Когда пользователь загружает картинку в поле Image, Odoo не просто сохраняет файл «как есть» — изображение проходит обработку.
Автоматическое изменение размера
При объявлении fields.Image указывают max_width и max_height. Если загруженная картинка больше этих размеров, Odoo пропорционально уменьшит её при сохранении. Всё происходит прозрачно для пользователя: нагрузка за кадром.
По умолчанию стандартное поле называют image_1920 — потому что максимум по длинной стороне составляет 1920 пикселей. Это стандартная практика для моделей вроде product.template или res.partner.
Варианты размеров изображений
В стандартных моделях часто встречается набор связанных полей: image_1920, image_1024, image_512, image_256, image_128. Это отдельные fields.Image, связанные с основным изображением и имеющие собственные ограничения по размерам.
Такой подход позволяет отдавать подходящую версию в зависимости от контекста: список товаров загружает миниатюру 128px, страница товара — полную 1920px. В кастомной модели это имеет смысл внедрять, если вы заранее понимаете места показа картинок — иначе можно обойтись одним полем.
Хранение через ir.attachment
По умолчанию изображения хранятся как вложения в модель ir.attachment, а не прямо в таблице записи. Запись хранит ссылку на вложение, а не весь бинарный массив.
Это делает главные таблицы компактнее и даёт предсказуемые URL для картинок, например /web/image/product.template/42/image_1920 — такие ссылки используют сайт, шаблоны писем и API.
Права доступа
Доступ к изображению наследуется от прав на саму запись. Если пользователь не имеет права читать товар — он не сможет загрузить и его картинку. Это управляется встроенным уровнем безопасности Odoo и важно учитывать при публикации картинок на внешних страницах или в портале.
Бизнес-сценарии использования
Где чаще всего применяются Image-поля в реальных проектах
1. Каталог товаров (Продажи и Склад)
Фото товара — самый заметный пример: product.template имеет поле image_1920, и эти картинки попадают в интернет‑магазин, в PDF‑чек, в POS и в мобильные picking‑экраны. Для клиентов визуализация товара критична, поэтому поле нужно настроить правильно.
При больших каталогах изображения загружают пакетно через API, а не вручную. Поле принимает base64‑данные, поэтому массовая загрузка через XML‑RPC или JSON‑RPC автоматизируется без проблем.
2. Логотипы и фото партнёров (CRM и Закупки)
В модели res.partner хранится фото контакта и логотип компании. Логотипы видны в форме партнёра, в истории сообщений и в канбан‑картах CRM — это помогает коммерческим командам быстрее ориентироваться по аккаунтам.
3. Фото сотрудников (HR)
hr.employee содержит фото сотрудника: оно отображается в справочнике, иногда печатается на платежных документах и показывается рядом с сообщениями в модуле Discuss. При массовом наборе сотрудников фото часто загружают через импорт или API.
4. Фото оборудования (Maintenance)
В модуле техобслуживания технику можно снабдить фото, которое прикрепляют к заказу на ремонт. Поле упрощает задачу полевых техников: они видят картинку агрегата и сразу понимают, о чём речь.
5. Инспекции и акты качества
В кастомных формах для инспекций, контроля качества или подтверждений доставки удобно прикреплять снимок на место события. Это стандартная кастомизация — поле добавляют через Studio или код, и фотография служит доказательством выполненной работы.
Создание и настройка поля
Два пути добавления Image-поля: без кода через Studio и через Python для гибких настроек.
Через Odoo Studio
Studio — встроенный инструмент для быстрой кастомизации. Чтобы добавить изображение, откройте нужное приложение, включите Studio и перейдите в форму, где хотите разместить поле.
В панели полей перетащите Image на форму — Studio предложит метку и создаст поле в модели автоматически. Это удобный способ для функциональных консультантов и непрофессиональных разработчиков.
Поля, созданные через Studio, по умолчанию получают префикс x_studio_ (например, x_studio_site_photo) и ведут себя как обычные Image‑поля по хранению и отображению.
Через Python (разработка Odoo)
Для более тонкой настройки поле объявляют в Python‑модели. Ниже — базовый пример объявления поля изображения в кастомной модели.
from odoo import models, fields
class SiteInspection(models.Model):
_name = 'site.inspection'
_description = 'Осмотр объекта'
name = fields.Char(string='Номер', required=True)
photo = fields.Image(
string='Фото объекта',
max_width=1920,
max_height=1920,
)
photo_128 = fields.Image(
related='photo',
max_width=128,
max_height=128,
store=True,
string='Миниатюра',
)
Параметры max_width и max_height ограничивают сохраняемый размер (в примере 1920px). Второе поле photo_128 — связанное поле, хранящее уменьшенную версию для карточек или списков. Это стандартный паттерн Odoo для работы с несколькими размерами изображений.
Добавление поля в представление
Чтобы поле стало видимым на форме, его нужно вставить в XML‑представление и указать виджет image.
<field name="photo" widget="image" class="oe_avatar"/>
Класс oe_avatar выводит изображение в виде круглого аватара в левом верхнем углу формы — привычный стиль Odoo. Без этого класса изображение можно разместить в любой части макета формы.
Рекомендации по использованию
Рекомендации при работе с Image-полями
Устанавливайте реалистичные лимиты по размерам
По умолчанию 1920px подходит для большинства задач. Не увеличивайте лимит без крайней необходимости (например, для печати высокого качества): большие файлы раздувают вложения и замедляют загрузку страниц.
Создавайте миниатюры для списков и канбанов
Если картинка будет показана в списке или канбан‑стеке, определите отдельное маленькое связанное поле (128 или 256px). Загружать маленькую миниатюру гораздо быстрее, чем всю 1920px‑картинку для каждой карточки на экране.
Используйте API для массовой загрузки
При загрузке сотен или тысяч изображений работайте через XML‑RPC/JSON‑RPC: отправляйте base64‑данные программно, вместо ручного добавления через интерфейс. Это быстрее и автоматизируемо — в документации Odoo есть примеры таких сценариев.
Сжимайте изображения заранее
Хотя Odoo меняет размеры, он не всегда сильно сжимает JPEG. Файл 5 МБ, уменьшенный до 1920px, всё ещё может весить сотни килобайт. Предварительная компрессия поможет контролировать объём вложений при больших каталогах.
Не включайте большие изображения в часто запрашиваемые списки
Если вы добавите Image‑поле в колонку списка, Odoo будет подтягивать бинарные данные для каждой строки — и это замедлит представление. Лучше использовать миниатюру в списке и хранить полноразмерную картинку только в форме.
Типичные ошибки и подводные камни
Частые ошибки команд при работе с Image
Путаница между Binary и Image
Binary без виджета image отображается как кнопка «скачать», а не карточка‑предпросмотр. Для корректного показа нужен либо fields.Image, либо fields.Binary с widget="image" в представлении — забывают об этом при старых версиях Odoo.
Недостаточное планирование вариантов размеров
Легко добавить одно большое поле, а позже обнаружить потребность в миниатюрах для канбана или сайта. Добраться до этого решения задним числом часто значит делать миграцию базы. Планируйте варианты размеров заранее.
Сохранение картинок прямо в колонках базы
В старых или неправильно настроенных инсталляциях бинарные данные могли сохраняться непосредственно в основной таблице, раздувая её и замедляя запросы. Убедитесь, что вложения хранятся через file storage или внешнее S3‑хранилище, если это нужно.
Использование Image‑полей как хранилища документов
Некоторые пытаются класть отсканированные документы или многостраничные PDF в Image‑поля. Это неверно: для документов лучше подходит модуль Documents или Binary‑поле с файловым виджетом. Image создано для фотографий и логотипов, а не для актов и сканов.
Забывчивость по правам доступа на публичных страницах
Если вы публикуете URL картинки на сайте или в портале, но запись не доступна публично, картинка вернёт 404. При создании публичных страниц и порталов убедитесь, что права доступа настроены корректно.
Заключение
Итог: простая на вид, но требовательная к планированию
Поле Image выглядит тривиально для конечного пользователя, но проекту оно может добавить технической сложности, если не учесть хранение, ресайз и шаблон миниатюр заранее. Для разработчика шаблон с fields.Image и связанными миниатюрами — стандартный и надёжный подход.
Независимо от задачи — загрузка фото товара, привязка снимка при осмотре объекта или показ логотипов в клиентском портале — Image‑поле даёт аккуратный и интегрированный способ хранить визуальные данные в модели Odoo.
Нужна помощь с внедрением Odoo?
В компании Dasolo мы помогаем внедрять и настраивать Odoo в разных отраслях и версиях. Нужен ли вам конфигурирование полей стандартных моделей, разработка кастомных модулей или перенос данных из древней системы — мы работаем вместе с вашей командой, чтобы Odoo заработал так, как этого требует бизнес.
Если у вас остались вопросы по настройке Odoo или вы хотите обсудить возможности платформы, свяжитесь с нами,мы будем рады помочь.