当前位置: 首页 > news >正文

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

明白,你现在使用的是 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+ 简单,因此跟踪非常容易。

http://www.jsqmd.com/news/50440/

相关文章:

  • 对于高增量数据库的解决方案记录(暂时修改)
  • 2025年北京阅卷考试软件公司权威推荐榜单:自动阅卷软件/网上阅卷的软件/答题卡扫描源头公司精选
  • 2025年11月五大GEO优化公司:技术融合驱动增长新生态
  • 《基于IPD流程的研发项目管理》公开课(2025年12月12-13日)
  • HarmonyOS应用性能调优与内存管理实战 - 指南
  • CF1450C2 Errich-Tac-Toe (Hard Version)
  • 使用 Privoxy 将 socks5 转为 http/https
  • 迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
  • 国际象棋
  • 2025苏州留学机构十强排名榜
  • 背包的第 $k$ 优解
  • 2025深圳香港留学中介机构有哪些
  • MySQL权限管理的坑你踩了没有?
  • 2025厦门十大正规留学机构排名榜
  • 后缀树模板
  • 2025 年 11 月冷却塔厂家权威推荐榜:闭式冷却塔、方形冷却塔、工业冷却塔、全钢冷却塔、凉水塔、圆形冷却塔、玻璃钢冷却塔、防腐冷却塔、冷却水塔,高效散热与持久耐用的专业之选
  • 好用的库存管理系统盘点:橙子库存通——简洁实用、功能齐全,出入库管理更省心
  • 2025广州最大的留学中介机构
  • 库存管理系统哪家强?橙子库存通:专业稳定,安全可靠,110万企业的共同选择
  • 2025北京留学中介哪些机构好一点
  • k8s chain
  • C++ - 手动实现std::shared_ptr
  • 数据库风险监测系统:打造可审查、可调整、可溯源的教育数据库安全底座
  • 详细介绍:云计算概念及虚拟化
  • 使用Logstash实现PostgreSQL到Elasticsearch的数据摄取
  • 不丢帧、低延迟!图像采集卡的 5 步工作原理,看懂就是专家
  • 2025年封闭母线槽优质厂家权威推荐榜单:耐火母线槽/防水母线槽/空气型母线槽源头厂家精选
  • 2025年服装整烫专用设备定做厂家权威推荐榜单:服装小型整烫设备/服装隧道整烫设备/仙桃服装整烫设备源头厂家精选
  • 2025年数据分类分级产品选型排名与深度解析:可视化、自适应、一键部署成关键能力
  • 2025年国内一键部署、持久稳定的AI赋能的API数据接口安全厂商排名