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
相关产品推荐
相关产品推荐

