表单联动

Odoo onchange 为什么总让人又爱又恨:即时表单联动和真实落库边界讲透

很多开发把 onchange 当成万能自动化,结果表单看起来很聪明,落库却不稳定。本文把 onchange 在用户体验层和持久化层的边界讲清楚。

Odoo 开发
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 6 阅读

先说结论

onchange 在 Odoo 里特别有用,但它最擅长解决的不是“持久规则”,而是:

用户正在编辑表单时,系统怎样即时给出联动反馈。

所以它更偏用户体验层,而不是最终业务规则落库层。

这层一旦没分清,表单会看起来很聪明,但数据规则却会越来越不稳。


为什么大家特别容易把 onchange 用重

因为它看起来很好用:

  • 改一个字段
  • 另一个字段立刻跟着变
  • 用户马上看到结果

于是很容易觉得:

  • 这不就能顺手把业务规则也一并做了吗?

问题就在这里。

即时表单反馈和最终持久规则,并不是同一层事情。


onchange 真正最擅长什么

它最擅长的是:

  • 帮用户预填值
  • 在表单里即时联动
  • 减少手工输入
  • 让界面交互更顺

所以它特别适合:

  • 选择客户后自动带联系人
  • 改数量后先预估金额
  • 改产品后提示默认值

这些场景的共同点是:

  • 它们首先服务的是编辑体验。

为什么它不该承担最终业务约束

因为用户体验层的变化,不等于最终数据库一定会按同样路径落下去。

很多对象并不一定通过同一个表单入口创建:

  • 后台导入
  • 定制代码 create/write
  • RPC / API
  • 批量操作

这些路径如果绕开了表单 onchange,你原本写在 onchange 里的“规则”就未必会生效。

所以把最终业务约束只写在 onchange 里,是非常危险的。


最稳的分工应该是什么

一个很稳的心智模型是:

  • onchange:负责让用户填表更顺
  • compute / constraints / create / write:负责真实规则和落库边界

这样分层的好处是:

  • 用户体验有了
  • 业务约束也不会只靠界面撑着

这比把所有自动化都塞给 onchange 稳太多。


为什么“表单上看对了”还不够

因为有些 bug 正是这样来的:

  • 用户在界面上看起来没问题
  • 一保存、导入或接口调用就出偏差

这类问题的根因通常就是:

  • 你把界面联动结果误当成了系统最终规则

所以判断 onchange 是否合适时,最好先问:

  • 这是不是只属于“编辑时反馈”
  • 还是系统无论从哪个入口进来都必须保证的规则

实战里最容易踩的 5 个坑

1. 把最终业务规则只写在 onchange

其他入口一绕开就失效。

2. 只关心表单看起来顺不顺

忽略落库一致性。

3. onchange 写得太重,什么都想联动

界面会越来越难维护。

4. 误把即时预填当成最终可信数据来源

后面很容易出偏差。

5. 不分体验层和规则层

这是根本问题。


一句话记忆法

把它记成一句话:

onchange 最擅长的是“用户正在填表时的即时联动体验”,而不是“无论从哪个入口进入都必须成立的最终业务规则”。

理解这一句,onchange 就不容易再被你用成万能胶。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。