如何在 Odoo 中从 XML 文件调用函数

如何在 Odoo 19 中从 XML 文件调用函数

在 Odoo 中,视图通常通过 XML 设计,支持创建各类数据结构与交互界面。尽管 XML 功能强大,但在实际业务场景中(尤其是处理动态或大规模数据集时),往往会面临挑战。例如,在生产环境中安装模块时,可能需要自动更新现有记录 ------ 这种场景下,就需要一种能在模块安装阶段触发特定操作的机制。

本文将介绍如何在 XML 文件中使用 <function> 标签,在 Odoo 模块安装过程中调用方法。很多时候,模块安装完成后需立即执行特定操作,而 <function> 标签可触发所需方法或函数,确保这些操作在安装过程中无缝执行。

下面将逐步讲解具体实现方式。

一、核心前提:创建 XML 数据文件

要从 XML 文件调用函数,首先需创建一个 XML 文件(如 product_function.xml),用于定义所需数据与待调用的函数。该文件将作为 "指令容器",指定模块安装时需执行的方法。

基础 XML 文件框架如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
   <data noupdate="1">
   </data>
</odoo>

关键参数:noupdate 的作用

noupdate 参数用于控制 "模块更新时,XML 文件中的数据是否重新导入",具体规则如下:

  • 当设置 noupdate="1" 时(常见于含演示数据的文件):若某条记录在模块更新前已被删除,更新时不会重新导入该记录;但如果数据库中原本就没有这条记录,则会重新导入。
  • 当设置 noupdate="0" 时:无论记录是否存在或被删除,模块更新时都会重新导入该记录。

该参数的核心作用是避免模块更新时重复执行 XML 中的指令(如重复调用函数导致数据冗余)。

注意 :需将此 XML 文件(如product_function.xml)添加到模块的 __manifest__.py 文件中,确保模块加载时能识别并执行该 XML 中的内容。

二、两种函数调用场景实操

1. 调用无参数函数

需先在模型中定义无参数函数,再通过 XML 的 <function> 标签调用。

步骤 1:在模型中定义无参数函数

在模块的 Python 模型文件中(如 product_function/product_function.py),继承目标模型并定义函数。示例如下(以继承 "产品模型" 为例):

python 复制代码
# -*- coding: utf-8 -*-
from odoo import models, fields, api

class ProductDetails(models.Model):
    _inherit = 'product.product'  # 继承自 Odoo 内置的"产品(product.product)"模型

    @api.model  # 模型级装饰器,无需传入具体记录集即可调用
    def fun_invoke_without_param(self):
        # 函数功能:创建一条名为"test"的产品记录
        self.create(dict(name='test'))
步骤 2:在 XML 中调用无参数函数

在之前创建的 product_function.xml 文件中,使用 <function> 标签指定 "目标模型"与"函数名",即可调用上述无参数函数:

xml 复制代码
<function model="product.product" name="fun_invoke_without_param"/>
  • model="product.product":指定函数所属的模型(即上述代码中继承的 product.product);
  • name="fun_invoke_without_param":指定要调用的函数名(需与模型中定义的函数名完全一致)。

2. 调用带参数函数

若函数需传入参数,需先在模型中定义带参函数,再通过 XML 的 <value> 标签传递参数值。

步骤 1:在模型中定义带参数函数

在同一模型文件中,定义接收参数的函数(示例中参数为 name,用于指定产品名称):

python 复制代码
@api.model
def fun_invoke_with_param(self, name):
    # 函数功能:根据传入的"name"参数,创建对应的产品记录
    self.create(dict(name=name))
步骤 2:在 XML 中调用带参数函数

在product_function.xml 中,通过 <function> 标签指定模型与函数名,并在标签内部用 <value> 标签传递参数值。示例如下:

xml 复制代码
<function model="product.product" name="fun_invoke_with_param">
    <value>奶茶demo</value>  <!-- 传递给函数的"name"参数值 -->
</function>
  • 若函数需多个参数,可添加多个 <value> 标签,参数顺序需与函数定义中的参数顺序一致;
  • 示例中传递的参数值为 "奶茶demo",模块安装后会创建一条名为该名称的产品记录。

三、完整 XML 文件示例

结合上述两种场景,最终的 product_function.xml 文件内容如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
   <data noupdate="1">
       <!-- 调用无参数函数 -->
       <function model="product.product" name="fun_invoke_without_param"/>
       
       <!-- 调用带参数函数 -->
       <function model="product.product" name="fun_invoke_with_param">
           <value>奶茶demo</value>
       </function>
   </data>
</odoo>

四、执行效果

将模块安装到 Odoo 系统后,上述 XML 中定义的 <function> 标签会自动触发对应的函数:

  • 无参数函数 fun_invoke_without_param 执行,创建一条名为 "test" 的产品记录;
  • 带参数函数 fun_invoke_with_param 执行,创建一条名为 "奶茶demo" 的产品记录。

通过这种方式,可在模块安装阶段自动完成数据初始化、记录更新等操作,无需手动执行代码。

相关推荐
2301_818732062 天前
项目启动报错,错误指向xml 已解决
xml·java·数据库·后端·springboot
csdn2015_3 天前
generatorConfig.xml 配置 Controller、Service 完整教程
xml·mybatis
特立独行的猫a3 天前
从XML到Compose的UI变革:现代(2026)Android开发指南
android·xml·ui·compose·jetpack
spencer_tseng3 天前
Stream not available [SysDictDataMapper.xml]
xml·java
qq_297574674 天前
MySQL迁移到瀚高数据库 常用转换函数对照表(附XML示例,直接复用)
xml·数据库·mysql
好好研究5 天前
SpringBoot整合SpringMVC
xml·java·spring boot·后端·mvc
云草桑6 天前
15分钟快速了解 Odoo
数据库·python·docker·postgresql·.net·odoo
从此不归路6 天前
Qt5 进阶【12】JSON/XML 数据协议处理:与后端/配置文件的对接
xml·开发语言·c++·qt·json
方芯半导体7 天前
EtherCAT “通信 + 控制“ 的全国产化控制方案,ESC芯片(FCE1323)与国产MCU芯片功能板解析
xml·网络·单片机·嵌入式硬件·网络协议·机器人·自动化
好好研究7 天前
总结SSM设置欢迎页的方式
xml·java·后端·mvc