Odoo14使用PIL生成图片赋值给Image字段出现TypeError问题咨询
问题根因
Odoo的fields.Image类型仅接收base64编码的图片字符串作为合法值,你直接将PIL生成的Image实例赋值给字段,Odoo内部处理字段值时尝试对非序列类型的Image对象做下标取值操作,就触发了该TypeError。
修复方案
你需要将PIL生成的图片先转成字节流,再编码为base64字符串后再赋值给plan字段,完整实现如下:
- 先在文件头部引入依赖包:
import base64 from io import BytesIO from PIL import Image
- 修正create方法逻辑:
@api.model def create(self, vals): if not vals.get('plan'): # 生成指定尺寸的红色图片 img = Image.new('RGB', (640, 480), '#FF0000') # 将图片写入内存字节流 buffer = BytesIO() img.save(buffer, format='PNG') # 编码为base64字符串赋值给字段 vals['plan'] = base64.b64encode(buffer.getvalue()).decode('utf-8') return super(Halle, self).create(vals)
额外优化建议
- 如果不需要动态生成图片,可以提前准备好默认红色图片,将它的base64编码直接硬编码到代码中,省去运行时生成图片的性能开销,也可以避免PIL依赖带来的环境问题。
- 如果需要支持用户编辑时清空plan字段后也自动填充默认值,可参照create的逻辑重写
write方法即可。
内容的提问来源于stack exchange,提问作者unnamed-dev
相关产品推荐
相关产品推荐

