Odoo技术问题:如何通过带图标链接在新标签页打开记录
在Odoo列表视图中用图标实现新标签页打开记录的方案
针对你遇到的「url widget显示完整链接导致单元格过大」的问题,这里提供两种可行方案,都能实现仅显示🔗图标、点击新标签页打开记录且支持右键复制链接的需求:
方案一:HTML计算字段快速实现
无需编写前端JS,通过后端计算生成带图标的HTML链接,直接在列表中渲染:
1. 模型中添加计算字段
from odoo import models, fields class YourModel(models.Model): _inherit = 'your.model.name' # 替换为你的模型名 open_in_new_tab = fields.Html(string='打开记录', compute='_compute_open_in_new_tab') def _compute_open_in_new_tab(self): base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for record in self: # 生成记录的表单视图URL record_url = f"{base_url}/web#id={record.id}&model={self._name}&view_type=form" # 生成仅含图标的HTML链接,添加title提示,去除下划线 record.open_in_new_tab = f'<a href="{record_url}" target="_blank" title="在新标签页打开记录" style="text-decoration:none;">🔗</a>'
2. 列表视图中添加该字段
<record id="your_model_list_view_extend" model="ir.ui.view"> <field name="name">your.model.name.list.extend</field> <field name="model">your.model.name</field> <field name="inherit_id" ref="your_module.your_model_list_view"/> # 替换为原列表视图的引用 <field name="arch" type="xml"> <!-- 在指定字段后插入图标列,可自行调整位置 --> <xpath expr="//tree//field[@name='existing_field']" position="after"> <field name="open_in_new_tab" /> </xpath> </field> </record>
优点:实现简单,无需前端开发;标准<a>标签支持右键复制链接、新标签页打开等原生操作。
方案二:自定义Widget(全局复用)
如果多个模型都需要这个功能,自定义Widget更优雅,可全局注册复用:
1. 编写前端Widget代码
在模块的static/src/js/目录下创建open_in_new_tab_widget.js:
odoo.define('your_module.open_in_new_tab_widget', function(require) { "use strict"; var core = require('web.core'); var UrlWidget = require('web.basic_fields').UrlWidget; var OpenInNewTabWidget = UrlWidget.extend({ _renderReadonly: function() { // 重写只读模式渲染逻辑,仅显示图标 var $link = $('<a>') .attr('href', this.value) .attr('target', '_blank') .attr('title', '在新标签页打开记录') .text('🔗') .css('text-decoration', 'none'); this.$el.html($link); }, }); // 注册自定义Widget core.field_registry.add('open_in_new_tab', OpenInNewTabWidget); return OpenInNewTabWidget; });
2. 模型中添加URL计算字段
from odoo import models, fields class YourModel(models.Model): _inherit = 'your.model.name' record_url = fields.Char(string='记录链接', compute='_compute_record_url') def _compute_record_url(self): base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for record in self: record.record_url = f"{base_url}/web#id={record.id}&model={self._name}&view_type=form"
3. 列表视图中使用自定义Widget
<record id="your_model_list_view_extend" model="ir.ui.view"> <field name="name">your.model.name.list.extend</field> <field name="model">your.model.name</field> <field name="inherit_id" ref="your_module.your_model_list_view"/> <field name="arch" type="xml"> <xpath expr="//tree//field[@name='existing_field']" position="after"> <field name="record_url" widget="open_in_new_tab" /> </xpath> </field> </record>
4. 在模块配置中引入JS文件
修改__manifest__.py,添加资源引用:
{ # ...其他配置项 'assets': { 'web.assets_backend': [ 'your_module/static/src/js/open_in_new_tab_widget.js', ], }, }
优点:一次编写多模型复用;Widget可扩展更多自定义逻辑(比如权限控制、动态图标等)。
内容的提问来源于stack exchange,提问作者Alesis Joan
相关产品推荐
相关产品推荐

