
在 Odoo 16 中,可通过定义多个继承视图并绑定不同用户组(如 base.group_system 和 base.group_user),结合 groups_id 属性与 position="attributes" 动态设置字段的 readonly 状态,实现非管理员用户只读、管理员可编辑的效果。
在 odoo 16 中,可通过定义多个继承视图并绑定不同用户组(如 `base.group_system` 和 `base.group_user`),结合 `groups_id` 属性与 `position="attributes"` 动态设置字段的 `readonly` 状态,实现非管理员用户只读、管理员可编辑的效果。
要为自定义字段(如 recommanded_price)实现「仅对非管理员用户设为只读」,不能依赖 attrs 中的 groups 条件判断(因为 attrs 不支持 groups 这一域操作符,该写法在 Odoo 16 中无效且会静默失败)。正确方案是:为同一字段创建两套独立的视图继承记录,分别指定 groups_id,并在对应视图中通过 XPath 修改字段属性。
以下是推荐的、经过验证的实现方式:
<odoo><data><!-- 视图继承 1:仅对系统管理员(base.group_system)生效,确保字段可编辑 --><record id="product_template_only_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)生效,设为只读 --><record id="product_template_only_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]) 格式精确限定该视图仅对指定用户组可见/生效;
- 必须确保 recommanded_price 字段已在原视图或当前继承中存在(即先有
),否则 XPath 查找不到节点; - 若字段尚未出现在原表单中,需先用 position="inside" 添加它(建议放在 group_general 内),再通过上述方式控制其属性;
- 不要混用 readonly="1" 属性与 attrs 中的 groups 判断——后者在 Odoo 中不被支持,会导致逻辑失效;
- 多个视图继承记录 ID 必须唯一(如 product_template_only_form_view_admin 和 product_template_only_form_view_user),避免覆盖冲突。
? 进阶提示:
如需支持更多角色(如会计、销售经理),可依此模式扩展更多 groups_id 绑定的视图记录,并按需设置 readonly 值。所有视图将由 Odoo 自动根据当前用户所属组进行匹配与合并,无需手动逻辑判断。
最终效果:系统管理员可自由编辑 Recommended Price,而普通用户登录后该字段自动灰显且不可修改,安全、简洁、符合 Odoo 最佳实践。










