导读
如果你在 Odoo 中上传过商品照片、设置过公司标志,或给员工档案加过头像,那么你已经在使用 Image 字段了。它是 Odoo 数据模型里最直观的字段类型之一,比许多人意识到的出现位置还要多得多。
对普通业务用户来说,Image 字段感觉就是“点一下、上传、显示”。但对顾问和开发者而言,其背后有专门的存储方式、自动缩放逻辑和若干细节;在为自定义模型添加图片前,了解这些实现细节能避免后续维护麻烦。
本文将介绍 Image 字段保存了什么、在 Odoo 框架中如何表现、如何通过 Studio 或 Python 添加它,以及若干切合实际的业务示例。
什么是 Odoo 的 Image 字段
Image 字段是 Odoo ORM 中的专用字段类型(从 Odoo 13 引入为 fields.Image)。在此之前,开发者通常用 fields.Binary 配合 image 小部件来实现类似功能。现在的 Image 类型能独立处理图片生命周期,包括自动缩放与展示。
底层上,Image 字段以 base64 编码的二进制形式保存图像数据。现代 Odoo 实践通常把这些二进制作为附件(ir.attachment)管理,而不是把大量二进制直接塞到主表里,这样能让数据库表更轻、也便于通过附件 URL 高效分发图片。
界面中的呈现方式
在表单里,Image 字段以可点按的图片占位形式出现,用户可以从本地上传文件,有的场景下也支持粘贴图片网址。字段会在表单上显示缩略图,便于一眼识别。
在列表视图中通常不会展示图片缩略图,因为每行都拉取二进制会拖慢加载。但在看板(kanban)卡片或商品目录等卡片式布局中,显示小图能显著提升视觉辨识度。
Image 与 Binary 的区别
二者用途不同:fields.Binary 可以保存任意文件(PDF、压缩包、表格等),而 fields.Image 专门用于图片,会在保存时做尺寸限制、校验并默认配合图片小部件渲染。存储照片或 logo 用 Image,存储文档用 Binary。
字段的工作原理
当用户上传图片到 Image 字段时,Odoo 并非把原始文件直接存档,而是先对图片做必要处理。
自动缩放行为
在 fields.Image 定义中可以传入 max_width 和 max_height 参数,若上传图片超出这些尺寸,Odoo 会在保存时按比例缩放到允许范围,整个过程对用户透明。
默认的最大尺寸通常设为最长边 1920 像素,因此标准模型里常见名为 image_1920 的字段(如 product.template 或 res.partner)。
不同尺寸的图片变体
在内置模型中,常见做法是以主图为源定义多个相关的 Image 字段:image_1920、image_1024、image_512、image_256、image_128 等,每个字段在定义时有不同的尺寸上限且通过 related 指回主图。
这样可以根据展示场景取用合适尺寸的图片:商品列表调用小图节省流量与加载时间,详情页调用大图以保证清晰度。对于自定义模型是否采用多尺寸方案,取决于图片会在哪些页面使用。
以附件形式存储
默认情况下,Image 字段的数据存为 Odoo 的附件(ir.attachment),记录本身只保存对该附件的引用。
这种做法能让主表保持轻量,并且图片可通过固定模式的 URL 访问,如 /web/image/product.template/42/image_1920,经常用于网站、邮件模板和 API 返回中。
访问控制机制
图片的访问遵循与记录同样的权限规则:若用户对该记录没有读权限,就无法获取对应图片。Odoo 的安全层会自动处理这一点,在构建对外网站或门户时务必注意权限设置。
实际业务场景举例
Image 字段在几乎每个 Odoo 模块中都有实际应用。下面列出典型场景。
1. 商品目录(销售与库存)
商品图片可能是最直观的应用。每个 product.template 通常带有 image_1920,图片会出现在网店、销售订单 PDF、POS 界面以及移动端拣货界面。
对于拥有大量商品的企业,常通过 API 批量上传图片而不是逐条在界面中手动添加。Image 字段接受 base64 编码的二进制,便于使用 XML-RPC 或 JSON-RPC 程序化上传。
2. 客户与供应商的公司标识(CRM 与采购)
res.partner 模型包含用于联系人头像和公司 logo 的 Image 字段,这些图片会出现在联系人表单、交互记录以及 CRM 看板中,帮助销售人员快速在视觉上识别账户。
3. 员工照片(人力资源)
hr.employee 存储员工照片,用于员工名录、某些配置下的工资单显示以及讨论模块中的消息头像。HR 在大批量入职时常用导入或 API 批量加载照片。
4. 设备与资产照片(维修)
维修模块允许在设备记录上附加图片,现场技师在接单前通过图片能快速确认设备类型或外观,降低误认风险。
5. 自定义巡检或质检表单
很多企业在 Odoo 中为质检、现场巡检或送货确认建自定义模型,Image 字段能让现场人员把照片作为证据直接绑定到记录上——不论是通过 Studio 还是代码实现,这都是常见且有效的扩展方式。
如何创建或定制 Image 字段
添加 Image 字段有两条常用路线:不用写代码的 Studio 方式,和适合技术化定制的 Python 方式。
通过 Odoo Studio 添加
Odoo Studio 是内置的无代码定制工具。在目标应用中激活 Studio,打开需要修改的表单视图,即可在左侧字段面板拖拽 Image 字段到表单上。
Studio 会为该字段生成标签并在模型上创建底层字段;这是业务用户或功能顾问在不找开发的情况下扩展模型时的推荐途径。
通过 Studio 创建的字段通常带有 x_studio_ 前缀(例如 x_studio_site_photo),在存储与展示行为上与原生 Image 字段一致。
通过 Python 开发添加
需要更细粒度控制时,在 Python 模型文件里直接定义 Image 字段是标准做法。示例如下展示了如何在自定义模型里增加图片与缩略图字段:
示例展示了在模型中定义 name、photo(主图,限制最大边 1920)及 photo_128(related 缩略图,最大边 128 且存储为单独字段)的典型写法。
通过设置 max_width 与 max_height,主图被限制在 1920 像素;相关字段 photo_128 则保存缩小后的版本,便于在看板或列表中使用,这是 Odoo 常用的多尺寸图片处理模式。
将字段放到视图中显示
字段在模型上创建后,还需在相应视图里声明才能在界面中可见。表单视图里通常以 widget="image" 来渲染 Image 字段:
<field name="photo" widget="image" class="oe_avatar"/>
加上 oe_avatar 类可以把图片放成表单左上角的圆形头像,这是 Odoo 常见的样式;不加该类则可把图片以内嵌方式放在表单布局中。
最佳实践建议
给客户的建议要点
设定合理的尺寸限制
默认 1920 像素对大多数场景已足够,除非你确实需要用于印刷的超高清图片,否则不要随意放大该限制。更大的图片意味着更大的附件,影响数据库占用与页面加载速度。
为列表或看板准备缩略图
如果要在列表或看板中展示图片,最好额外定义一个 128 或 256 像素的缩略字段。加载 128 像素小图远比每行请求 1920 像素的大图要高效得多。
批量上传请走 API
要给数百或数千条记录加载图片时,不要用人工界面操作。通过 Odoo 的 XML-RPC 或 JSON-RPC 接口上传 base64 编码的图片更快且可脚本化,开发者文档对此有详细说明。
上传前先压缩图片
尽管 Odoo 会按尺寸缩放,但并不总是做极致的压缩。一张原始 5MB 的 JPEG 即便被缩到 1920 像素,仍可能有数百 KB。事先压缩图片能显著降低附件体积,尤其是大目录导入时很关键。
避免在高频查询的列表中直接放全图
把 Image 字段直接放到列表列中会让系统为每行读取二进制数据,明显拖慢列表加载。确实需要可视化时只用小缩略图,全图留在表单视图。
常见错误与陷阱
常见错误与误区
混淆 Binary 与 Image
如果用 Binary 字段而不在视图中指定 image 小部件,界面只会显示下载按钮而不是图片预览。要展示图片,要么用 fields.Image,要么在 Binary 字段视图中手动加 widget="image"。这是在旧版本中常见的混淆源。
没有提前规划图片尺寸变体
起初只加一个大图很简单,但后来如果需要小图用于看板或网站,一旦字段在自定义模块中上线,补加这些相关字段可能需要数据库迁移。越早规划尺寸越省事。
把图片直接存入主表而不是附件
在老旧或配置不当的实例中,二进制被直接存进主表会让表膨胀、拖慢无关查询。确保实例配置为用附件存储或接入 S3 类存储,避免主表堆积大型二进制。
把 Image 字段当成文档库来用
部分用户会把扫描件或多页截图放进 Image 字段。虽可行,但并非最佳实践——文档管理应使用 Documents 模块或 Binary 字段配合下载小部件。Image 字段适合照片与标志,不适合多页文档。
忽视公开页面的访问规则
把图片 URL 放到公开网站或门户上时,如果后台记录对匿名用户不可见,图片会返回 404。构建对外页面时务必核对图片的访问权限是否匹配目标受众。
总结
总结要点:Image 字段表面上很简单,但如果不提前规划其尺寸、存储与权限,会给团队带来麻烦。熟悉 Odoo 的自动缩放、附件式存储和多尺寸模式能帮你避免常见问题。
对于业务人员来说,知道图片是安全地绑定在记录上并能通过可预测的 URL 访问,有助于构建网站或门户页面。对于开发者,掌握 fields.Image 配合相关缩略字段的组合是 Odoo 的标准模式,值得尽早熟悉。
无论是给商品添加图片、在自定义模型里附加现场巡检照片,还是在门户里展示客户 logo,Image 字段都是在 Odoo 中管理视觉数据的简洁、内建化方案。
需要 Odoo 实施支持吗?
我们是 Dasolo,专注于帮助企业实施、定制并优化各版本 Odoo。无论是配置标准模型字段、从零开发自定义模块,还是把遗留系统的数据迁移过来,我们都与客户紧密合作,将 Odoo 打造成符合业务实际运作的系统。
如果你对当前的 Odoo 配置有疑问,或想了解平台还能如何帮助你, 请与我们联系,我们很乐意协助你。