控制字段

Odoo 视图里的控制字段为什么最好“隐藏但同组”:NameManager 如何判定 Access Rights Inconsistency

不再泛讲 field groups 全景,而是只解释一个实战规则:给 invisible、readonly、required 表达式提供值的控制字段,为什么应该放进 view 且与被控制节点保持同组覆盖,否则 NameManager 会报 Access Rights Inconsistency。

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

这篇不讲所有 groups,只讲“控制字段”

关于 groups,大家最常见的理解是:

  • 这个字段给谁看
  • 这个按钮给谁点

但在实际项目里,更容易炸的其实不是展示字段,而是 控制字段

所谓控制字段,指的是那些本身不一定打算给用户看,但会被别的节点拿来做:

  • invisible
  • readonly
  • required
  • 甚至其他表达式判断

这类字段最稳妥的处理方式,不是“删掉”或“让某组完全看不见”,而是:

把它放进 view,必要时直接 invisible="1" 隐藏,但要和依赖它的元素保持同组覆盖。

不这么做,NameManager 就很容易判你一个:

  • Access Rights Inconsistency

为什么“用户看不见”仍然不代表“字段可以缺席”

很多人会写出类似结构:

<field name="secret_flag" groups="base.group_system"/>
<field name="amount" invisible="not secret_flag"/>

然后直觉上觉得:

  • 管理员看得到 secret_flag
  • 普通用户看不到
  • amount 照常显示,不就行了

问题在于,Odoo 看的不是“字段显示没显示完”,而是:

  • amount 这个节点会不会对某些用户出现
  • 它一旦出现,表达式里依赖的 secret_flag 对这些用户是否可访问

如果后者不成立,view 对这部分用户来说就不是自洽的。

所以 控制字段哪怕不展示,也不能在组覆盖上消失。

NameManager 到底在盯什么

ir_ui_view.py 里,NameManager 不是简单收集字段名而已。

它会综合跟踪:

  • 哪些字段在 view 里可用
  • 哪些字段本身有字段级 groups 限制
  • 哪些元素的表达式依赖了这些字段
  • 这些元素又会被哪些组看到

最后它会把这两边拿来对照:

  • 字段可访问组
  • 使用该字段的元素可见组

只要存在某种用户组组合:

  • 元素出现了
  • 依赖字段却不可访问

它就会认定这是权限不一致。

这也是为什么问题往往不是“XML 语法错”,而是 组覆盖关系错位。

_error_message_group_inconsistency() 真正在提示什么

很多人看到 warning 文案时,只抓住了标题:

  • Access Rights Inconsistency

但源码里的说明其实讲得很直白:

  • 有些元素会对一部分用户显示
  • 可它们依赖的字段对这些用户不可访问
  • 建议通过 group implication、groups 调整或 invisible 处理,让它们始终一起可用

这段提示的核心不是“你字段藏得不够深”,而是:

你把依赖关系拆散了。

所以最常见的修法,并不是继续给控制字段加更窄的 groups,而恰恰相反:

  • 让控制字段在同一批用户那里始终可用
  • 如果不想看见它,就用 invisible="1"

为什么“隐藏但同组”比“删掉字段”更稳

如果一个字段只是为了支撑表达式,最稳的做法通常是:

  • 保留在 view 中
  • 通过 invisible="1" 隐藏
  • 不要让它的 groups 比被控制节点更窄

这样做有几个好处:

1)表达式上下文稳定

前端和后端处理视图时,都不会碰到“引用了一个对当前用户缺席的字段”。

2)组覆盖关系更清晰

被控制节点在哪些组出现,控制字段就至少应在这些组里可用。

3)后续改造不容易埋雷

项目后期最容易出问题的,就是有人给控制字段偷偷再加一层 groups,结果关键 view 在受限用户那边开始报 warning。

什么时候才该真用 groups 限掉控制字段

也不是说控制字段永远不能带 groups。

如果它本身就是敏感字段,比如:

  • 审批结论
  • 财务私密标记
  • 人事受限状态

那你仍然可以做 groups 控制。

但一旦这样做,就必须同步确保:

  • 所有依赖它的节点也只对同样的组开放
  • 或者改写表达式,不再让更宽范围的元素依赖它

也就是说,问题不在“能不能加 groups”,而在:

  • 字段的组范围能否覆盖所有使用它的元素。

一个够用的判断法

当你准备在 view 里放一个控制字段时,先问自己四个问题:

  1. 它只是技术控制字段,还是敏感业务字段?
  2. 哪些节点的 invisiblereadonlyrequired 依赖它?
  3. 这些节点会对哪些组显示?
  4. 这个字段的 groups 是否至少覆盖这些组?

如果第 4 条答不上来,后面大概率就会遇到 NameManager 的提醒。

总结

关于 Access Rights Inconsistency,最值得记住的不是“系统又在挑刺”,而是这条工程经验:

控制字段可以隐藏,但不应该在组覆盖上比依赖它的节点更窄。

说得更直接一点:

  • 展示可以藏起来
  • 依赖关系不要拆散

把这条原则守住,你会少掉很多莫名其妙的 view warning。

DISCUSSION

评论区

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