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

Odoo 11中如何在新标签页或弹窗预览binary字段?

解决Odoo 11中Binary字段文件预览的问题

嘿,我来帮你搞定这个问题!Odoo 11默认的binary widget确实只支持下载,要实现预览得做点小改造。下面给你两种可行的方案,你可以根据自己的需求选:

方案一:自定义Binary Widget(推荐,更贴合原生体验)

这个方法是继承默认的binary widget,给它加上预览功能,点击字段就能在新标签页打开文件。

1. 编写自定义Widget的JS文件

在你的模块下创建static/src/js/preview_binary_widget.js,内容如下:

odoo.define('your_module_name.preview_binary_widget', function (require) {
    "use strict";

    var core = require('web.core');
    var BinaryWidget = require('web.binary_widget');

    var PreviewBinaryWidget = BinaryWidget.extend({
        start: function () {
            var self = this;
            this._super.apply(this, arguments);
            // 给文件上传后的按钮绑定预览事件
            this.$el.find('.o_form_binary_button').off('click').on('click', function (e) {
                e.preventDefault();
                if (self.value) {
                    // 构建预览URL:利用ir.attachment的web/content路由
                    var attachmentId = self.recordData.fpath_attachment_id; // attachment=True时,字段会自动关联ir.attachment,字段名是{field_name}_attachment_id
                    var url = '/web/content/' + attachmentId + '/datas?download=false';
                    window.open(url, '_blank');
                }
            });
        },
    });

    core.form_widget_registry.add('preview_binary', PreviewBinaryWidget);
    return PreviewBinaryWidget;
});

2. 在模块清单中注册JS文件

修改你的__manifest__.py,把刚才的JS文件加进去:

{
    # 其他配置...
    'assets': {
        'web.assets_backend': [
            'your_module_name/static/src/js/preview_binary_widget.js',
        ],
    },
}

3. 在视图中使用自定义Widget

修改你的view.xml,把原来的widget='binary'改成widget='preview_binary':

<field name="fpath" filename="name" widget='preview_binary'/>

方案二:添加独立预览按钮(更简单,无需自定义Widget)

如果不想写JS,也可以加一个按钮,点击后直接打开预览链接。

1. 在Python模型中添加辅助方法

在你的.py文件里,给模型加一个方法来获取预览URL:

from odoo import models, fields, api

class YourModel(models.Model):
    _name = 'your.model.name'
    # 你的现有字段...
    fpath = fields.Binary(string='upload', attachment=True)
    name = fields.Char(string='File Name')

    @api.multi
    def action_preview_file(self):
        self.ensure_one()
        # 获取对应的ir.attachment记录
        attachment = self.env['ir.attachment'].search([
            ('res_model', '=', self._name),
            ('res_id', '=', self.id),
            ('res_field', '=', 'fpath')
        ], limit=1)
        if attachment:
            # 返回预览URL,让前端打开新标签
            return {
                'type': 'ir.actions.act_url',
                'url': '/web/content/{}/datas?download=false'.format(attachment.id),
                'target': 'new',
            }

2. 在视图中添加预览按钮

修改view.xml的form视图,添加一个按钮:

<form>
    <!-- 你的其他字段... -->
    <field name="fpath" filename="name" widget='binary'/>
    <button name="action_preview_file" string="预览文件" type="object" class="oe_highlight"/>
</form>

关于Mail模块代码的小说明

其实Mail模块的附件预览核心也是用了/web/content/ir.attachment/id/datas?download=false这个路由,只是它封装了更复杂的弹窗、权限控制和格式判断逻辑。我们上面的方案是简化了这个逻辑,直接利用Odoo原生的文件访问路由来实现预览,更适合新手快速上手。

注意事项:

  • 一定要确保你的fpath字段设置了attachment=True,这样文件才会存储到ir.attachment表中,我们才能通过attachment ID构建预览URL。
  • 不同类型的文件浏览器支持的预览情况不一样:图片、PDF一般能直接预览,Word/Excel这类文档可能需要浏览器有对应插件,或者会提示下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:20