当前位置: 首页 > 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.rkmt.cn/news/60306.html

相关文章:

  • 对于高增量数据库的解决方案记录(暂时修改)
  • MySQL权限管理的坑你踩了没有?
  • 2025 年 11 月冷却塔厂家权威推荐榜:闭式冷却塔、方形冷却塔、工业冷却塔、全钢冷却塔、凉水塔、圆形冷却塔、玻璃钢冷却塔、防腐冷却塔、冷却水塔,高效散热与持久耐用的专业之选
  • 2025北京留学中介哪些机构好一点
  • k8s chain
  • 不丢帧、低延迟!图像采集卡的 5 步工作原理,看懂就是专家
  • 2025年服装整烫专用设备定做厂家权威推荐榜单:服装小型整烫设备/服装隧道整烫设备/仙桃服装整烫设备源头厂家精选
  • Spring Data JPA 最佳实践【1/2】:实体设计指南
  • 2025年11月呼叫中心系统品牌推荐评测报告:从稳定性到AI能力的解决方案剖析
  • 2025广州最大的留学中介是哪家
  • 2025北京申请留学机构哪家好
  • QQueue队列
  • 2025年11月数据标注平台推荐评测报告:从安全部署到智能辅助解决方案剖析
  • 2025年11月北京会计师事务所推荐:权威榜单与选择指南
  • 2025年远程高能点火器实力厂家权威推荐榜单:遥控高能点火器/防爆高能点火器/便携式高能点火器源头厂家精选
  • php Http请求 GET方式
  • plt.show()什么时候不用写?什么时候必须写?
  • Pyplot vs Seaborn 功能实现对比(直方图+箱线图) Pyplot → Seaborn 快速迁移指南
  • 2025年最新评价高的板材货架源头厂家找哪家,工业重型货架/手摇式板材货架/线棒流利货架/移动流利货架/重型滚轮式流利货架厂商推荐排行
  • AI元人文:构建价值共生的协契未来
  • 2025年11月上海审计事务所推荐榜单:主流机构对比与选择指南
  • 2025年11月上海审计事务所口碑推荐:用户评价与市场报告深度解析
  • 2025年11月高新技术企业认定公司推荐榜单与选择指南:权威解析与综合对比
  • Axis(/ˈksɪs/) Axes(/ˈksiːz/)两者的区别?
  • Vue 2 和 Vue 3 的简要对比
  • kube-proxy iptables 模式的原理
  • 2025年11月智能语音机器人品牌推荐对比分析:三大阵营专业维度深度评测报告
  • Numpy和Pandas都有哪些容器类型?Int64和DataFrame都叫数据类型?
  • 2025年比较好的食品塑料袋厂家最新热销排行
  • 2025年质量好的旋风骑士游乐设施厂家最新实力排行