这篇不讲所有 groups,只讲“控制字段”
关于 groups,大家最常见的理解是:
- 这个字段给谁看
- 这个按钮给谁点
但在实际项目里,更容易炸的其实不是展示字段,而是 控制字段。
所谓控制字段,指的是那些本身不一定打算给用户看,但会被别的节点拿来做:
invisiblereadonlyrequired- 甚至其他表达式判断
这类字段最稳妥的处理方式,不是“删掉”或“让某组完全看不见”,而是:
把它放进 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 里放一个控制字段时,先问自己四个问题:
- 它只是技术控制字段,还是敏感业务字段?
- 哪些节点的
invisible、readonly、required依赖它? - 这些节点会对哪些组显示?
- 这个字段的 groups 是否至少覆盖这些组?
如果第 4 条答不上来,后面大概率就会遇到 NameManager 的提醒。
总结
关于 Access Rights Inconsistency,最值得记住的不是“系统又在挑刺”,而是这条工程经验:
控制字段可以隐藏,但不应该在组覆盖上比依赖它的节点更窄。
说得更直接一点:
- 展示可以藏起来
- 依赖关系不要拆散
把这条原则守住,你会少掉很多莫名其妙的 view warning。
DISCUSSION
评论区