Odoo 18 客户端动作(Client Action)配置指南
1. 定义客户端动作的XML菜单
在模块的 views 目录下创建 client_action_views.xml 文件,定义 ir.actions.client 记录及关联的菜单项:
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- 客户端动作定义 -->
<record id="dashboard_ir_actions_client" model="ir.actions.client">
<field name="name">仪表盘</field>
<field name="tag">test_model.dashboard</field> <!-- 唯一标识符,关联前端组件 -->
<!-- 可选参数:target指定打开方式(current/main/fullscreen/new) -->
<!-- <field name="target">main</field> -->
</record>
<!-- 菜单项定义 -->
<menuitem
name="仪表盘"
id="advanced_dashboard_menu"
sequence="1"
action="dashboard_ir_actions_client"
/>
</data>
</odoo>
关键参数说明
tag客户端动作的唯一标识符,用于前端组件注册时匹配(需与JavaScript代码中的注册标签一致)。target控制动作的显示方式:
- current:在主内容区域打开(默认)。
- fullscreen:全屏模式打开。
- new:在对话框/弹出窗口中打开。
- main:重置面包屑导航(清除历史路径)。
params(可选)传递给前端的参数(如Python字典格式的键值对)。
2. 实现前端组件(JavaScript)
在模块的 static/src/js 目录下创建 client_action.js,继承OWL的 Component 类并注册动作:
/** @odoo-module **/
import { registry } from '@web/core/registry';
import { Component } from '@odoo/owl';
// 定义仪表盘组件
export class AdvancedDashboard extends Component {
setup() {
// 初始化逻辑(如数据加载、服务调用)
}
}
// 注册组件为客户端动作(tag需与XML中的tag一致)
AdvancedDashboard.template = "test_model.advanced_dashboard"; // 关联模板名称
registry.category("actions").add("test_model.dashboard", AdvancedDashboard);
3. 定义模板(XML)
在 static/src/xml 目录下创建 client_action.xml,定义组件的UI结构:
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="test_model.advanced_dashboard">
<div class="o_dashboard">
<h1>通过客户端动作渲染的仪表盘</h1>
<!-- 动态内容可通过props或服务注入 -->
</div>
</t>
</templates>
关键说明:t-name 需与JavaScript中 AdvancedDashboard.template 属性完全匹配。
4. 配置模块清单(manifest.py)
在 __manifest__.py 中确保XML和静态资源正确加载:
{
'name': '高级仪表盘',
'version': '1.0',
'depends': ['web'],
'data': [
'views/client_action_views.xml', # 加载XML菜单和动作
],
'assets': {
'web.assets_backend': [
'test_model/static/src/js/client_action.js', # 后端加载JS组件
'test_model/static/src/xml/client_action.xml', # 后端加载XML模板
],
},
}
操作验证
- 升级模块:在Odoo后台启用开发者模式,升级当前模块。
- 查看效果:在菜单中找到新增的“仪表盘”菜单项,点击后应显示模板定义的页面内容。

扩展说明
- 参数传递:通过 ir.actions.client 的 params 字段传递数据(如 {'key': 'value'}),在前端组件中通过 this.props 获取。
- 复杂交互:结合Odoo的服务(如 rpc、dialog)实现数据请求、弹窗等功能。
- 动作类型:除普通页面渲染外,客户端动作还可用于触发弹窗、导航跳转等前端逻辑。
通过以上步骤,可在Odoo 18中灵活配置客户端动作,实现自定义用户交互逻辑。