You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo向导中default_get填充二进制字段无法显示已存文件问题

解决Odoo向导中二进制字段显示字节数据而非已保存文件的问题

看起来你遇到的核心问题是Odoo向导无法正确渲染已保存的二进制文件——这是因为缺少文件名关联,Odoo的二进制字段在前端界面需要搭配文件名才能识别文件类型并显示为可访问的文件,而非原始字节串。下面是具体的修复步骤:

1. 补充销售订单行的文件名字段(可选但推荐)

为了完整保存文件的元信息,给你的SaleOrderLine类添加一个文件名字段,这样可以在保存文件时同时记录文件名:

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'
    label_file = fields.Binary('Saved Label')
    label_filename = fields.Char('Label File Name')  # 新增:存储文件名

2. 修改向导类,添加文件名字段并完善逻辑

更新你的OrderLineLabel向导类,添加对应的文件名字段,并在default_get方法中同时传递二进制内容和文件名:

class OrderLineLabel(models.TransientModel):
    _name = 'order.line.label'
    
    label_file_show = fields.Binary('Label file')
    label_filename = fields.Char('File Name')  # 新增:与二进制字段关联的文件名

    @api.multi
    def write_label_vals(self):
        self.ensure_one()
        sale_order_line = self.env['sale.order.line'].browse(self.env.context.get('active_ids'))
        vals = {
            'label_file': self.label_file_show,
            'label_filename': self.label_filename,  # 同步保存文件名到订单行
        }
        sale_order_line.write(vals)

    @api.model
    def default_get(self, fields):
        res = super(OrderLineLabel, self).default_get(fields)
        order_line_id = self.env['sale.order.line'].browse(self.env.context.get('active_ids'))
        if order_line_id:
            # 直接赋值二进制内容
            res['label_file_show'] = order_line_id.label_file
            # 传递文件名:优先取订单行已保存的文件名,无则设默认值
            res['label_filename'] = order_line_id.label_filename or "label.pdf"
        return res

3. 调整向导视图,关联二进制字段与文件名

在向导的Form视图XML中,给label_file_show字段添加filename属性,关联到我们新增的label_filename字段:

<record id="order_line_label_form" model="ir.ui.view">
    <field name="name">order.line.label.form</field>
    <field name="model">order.line.label</field>
    <field name="arch" type="xml">
        <form string="Label File">
            <group>
                <!-- 用filename属性关联文件名字段 -->
                <field name="label_file_show" filename="label_filename"/>
                <!-- 可以隐藏文件名字段,或显示让用户修改 -->
                <field name="label_filename" invisible="1"/>
            </group>
            <footer>
                <button name="write_label_vals" type="object" string="Save" class="btn-primary"/>
                <button string="Cancel" class="btn-default" special="cancel"/>
            </footer>
        </form>
    </field>
</record>

为什么这样能解决问题?

Odoo前端对二进制字段的渲染依赖文件名来识别文件类型(比如PDF、图片等),并生成对应的下载/预览链接。如果没有文件名,前端无法解析二进制内容的用途,就会直接显示原始的字节数据字符串。通过添加文件名字段并在视图中关联,Odoo会自动处理二进制数据的展示逻辑,打开向导时就能正确显示已保存的文件了。

内容的提问来源于stack exchange,提问作者Chaban33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:02:48