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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:34:58