
在 Odoo 16 中,需通过多视图继承配合 groups_id 属性,为不同用户组(如管理员与普通用户)分别定义同一字段的可编辑性,而非依赖 attrs 或 readonly 属性的条件表达式。
在 odoo 16 中,需通过多视图继承配合 `groups_id` 属性,为不同用户组(如管理员与普通用户)分别定义同一字段的可编辑性,而非依赖 `attrs` 或 `readonly` 属性的条件表达式。
在 Odoo 中,字段的 readonly 属性不支持在 attrs 中使用 groups 进行动态判断(如 {'readonly': [('groups', 'not in', ['base.group_system'])]}),该语法无效——attrs 仅支持针对记录字段值(如 state, active)的域条件,无法感知当前用户所属权限组。同样,直接在
✅ 正确做法是:利用 Odoo 的视图继承机制 + groups_id 字段 + 属性覆盖(position="attributes"),为不同用户组注册独立的视图记录。每个视图指定其生效的用户组,并通过 XPath 修改目标字段的 readonly 属性值。
以下是以 recommanded_price 字段为例,在 product.template 表单中实现「系统管理员可编辑、普通用户只读」的完整方案:
<odoo><data><!-- 视图 1:仅对 base.group_system(管理员)生效,显式设 readonly="0" --><record id="product_template_form_view_admin" model="ir.ui.view"><field name="name">product.template.form.admin</field><field name="model">product.template</field><field name="inherit_id" ref="product.product_template_only_form_view"></field><field name="groups_id" eval="[(6, 0, [ref('base.group_system')])]"></field><field name="arch" type="xml"><xpath expr="//field[@name='recommanded_price']" position="attributes"><attribute name="readonly">0</attribute></xpath></field></record><!-- 视图 2:仅对 base.group_user(普通用户)生效,设 readonly="1" --><record id="product_template_form_view_user" model="ir.ui.view"><field name="name">product.template.form.user</field><field name="model">product.template</field><field name="inherit_id" ref="product.product_template_only_form_view"></field><field name="groups_id" eval="[(6, 0, [ref('base.group_user')])]"></field><field name="arch" type="xml"><xpath expr="//field[@name='recommanded_price']" position="attributes"><attribute name="readonly">1</attribute></xpath></field></record></data></odoo>
? 关键说明:
- groups_id 使用 (6, 0, [ids]) 形式精确指定该视图仅对所列用户组生效;多个组可用逗号分隔,如 [ref('base.group_system'), ref('my_module.group_editor')];
- xpath 必须精准定位到目标字段(推荐用 //field[@name='xxx'] 而非依赖 group 容器,更鲁棒);
- 两个视图 inherit_id 相同,但 groups_id 互斥,Odoo 会自动按当前用户权限加载匹配的视图;
- 原始字段(在模型或父视图中)无需预设 readonly,由继承视图统一控制;
- 若字段尚未存在,需先通过另一继承视图添加(即「先 add,再 attrs/readonly 控制」),本例假设 recommanded_price 已正确定义于模型中且已在父视图中声明。
⚠️ 注意事项:
- 不要尝试在 attrs 中操作 groups —— 这是常见误区,会导致逻辑失效;
- 避免为同一视图设置多个 groups_id 混合控制(如 base.group_system 和 base.group_user 同时存在),易引发权限叠加异常;
- 部署后务必清除浏览器缓存并重启服务,确保新视图生效;
- 可通过「设置 → 技术 → 用户界面 → 视图」搜索 product.template.form 查看已激活的视图及其 Groups 列,验证分组逻辑是否正确加载。
此方案符合 Odoo 官方推荐实践,稳定、清晰、可维护,适用于所有需要基于用户角色动态控制字段编辑权限的场景。










