尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

odoo12 跟踪所有的模型调用的onchange 方法

odoo12 跟踪所有的模型调用的onchange 方法
📅 发布时间:2026/6/20 3:01:42

明白,你现在使用的是 Odoo 12,它的 onchange 机制确实和 Odoo 13+ 完全不同。

你贴出的 Odoo 12 的源码:

def _onchange_eval(self, field_name, onchange, result):...

在 Odoo 12 中,onchange 方法的核心逻辑集中在这里,而 这一段代码就是所有 onchange 执行的总入口。

下面我教你 如何在 Odoo 12 中跟踪所有 onchange 调用 + 如何用 PyCharm debug 精准断点。


✅ 一、Odoo 12 中跟踪所有 onchange 的最佳断点位置

Odoo 12 的 onchange 调用链:

views → JS → onchange → ORM → _onchange_eval → method(self)

你贴的 _onchange_eval 是 所有 onchange 执行的最核心入口。
要跟踪所有 onchange,只需要在这个方法里加断点或日志即可。


🔥 在此方法一行加入日志(最清晰)

修改为:

def _onchange_eval(self, field_name, onchange, result):_logger.info("[ONCHANGE DEBUG] model=%s field=%s onchange=%s",self._name, field_name, onchange)

放在函数开头即可。

你会看到日志类似:

[ONCHANGE DEBUG] model=sale.order field=partner_id onchange=1
[ONCHANGE DEBUG] model=sale.order field=order_line onchange=product_id_change
[ONCHANGE DEBUG] model=stock.move field=product_id onchange=onchange_product_id

🔥 PyCharm 中的断点位置(精准)

以下是 Odoo 12 的完整代码片段,我们直接标记你应当打断点的位置:

def _onchange_eval(self, field_name, onchange, result):_logger.info(">>> ONCHANGE TRIGGERED: model=%s field=%s onchange=%s",self._name, field_name, onchange)   # ← ← 打断点或日志onchange = onchange.strip()def process(res):...

只要你在这里下断点,所有 onchange 都会被捕获,包括:

  • @api.onchange
  • views 中的 onchange="foo(bar)"
  • widget 默认 onchange
  • one2many 的 onchange chain
  • many2one 引发的 cascaded onchange

🔧 二、如何查看每个 onchange 具体调用了哪个方法?

Odoo 12 的 onchange 方法来自:

self._onchange_methods[field_name]

所以你在断点时可以看到:

表达式 内容
field_name 当前触发的字段
onchange XML 中配置的 onchange 字符串
self._onchange_methods[field_name] 所有绑定的 Python onchange

例如:

self._onchange_methods["partner_id"]

会返回:

[<function SaleOrder.partner_id_change>,<function SaleOrder.onchange_partner_id_warning>,
]

🔥 三、PyCharm Debug 配置(关键步骤)

  1. 在 PyCharm 中创建 Python 配置:
Script path: odoo-bin
Parameters: --config=odoo.conf --dev=all
  1. 加上项目路径:
Working directory: Odoo 根目录
  1. 设置断点:
odoo/models.py   或者   odoo/models.py(Odoo12)

方法名:

_onchange_eval

启动 Debug → 网页 UI 上修改任何字段 → PyCharm 就会断下来。


🎯 如果你想跟踪某个具体模型的 onchange(建议)

在你自己的模型中写:

def _onchange_eval(self, field_name, onchange, result):if self._name == "sale.order":print(">>> SALE ORDER onchange:", field_name, onchange)return super()._onchange_eval(field_name, onchange, result)

☑ 只打印 sale.order
☑ 不影响其他模型
☑ 更适合大型项目执行效率更高


📌 四、总结(Odoo 12 专用)

需求 方法
跟踪所有 onchange 在 _onchange_eval() 开头打断点/日志
查看执行链 self._onchange_methods[field_name]
PyCharm debug 在 _onchange_eval 中断点即可
只跟踪特定模型 override _onchange_eval 并条件过滤

Odoo 12 的 onchange 机制比 13+ 简单,因此跟踪非常容易。

本文来自博客园,作者:那时一个人,转载请注明原文链接:https://www.cnblogs.com/qianxunman/p/19268371

相关新闻

  • 对于高增量数据库的解决方案记录(暂时修改)
  • MySQL权限管理的坑你踩了没有?
  • 2025 年 11 月冷却塔厂家权威推荐榜:闭式冷却塔、方形冷却塔、工业冷却塔、全钢冷却塔、凉水塔、圆形冷却塔、玻璃钢冷却塔、防腐冷却塔、冷却水塔,高效散热与持久耐用的专业之选

最新新闻

  • IAM系统测试实战:从单元测试到压力测试的完整指南
  • SEGGER emWin下拉框与编辑框控件实战:从核心API到工业HMI应用
  • 鹤州豪庭/鹤州新村桶装水送水电话多少 - 资讯速览
  • 嵌入式GUI开发实战:emWin中MULTIEDIT与MULTIPAGE控件的深度解析与应用
  • 如何快速上手dhcp:5分钟构建你的第一个DHCP客户端
  • 利用Microchip PRG外设实现硬件级三角波生成与VCO控制

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号