Odoo 16中如何通过XML按用户组设置字段只读权限?
问题分析与解决方案
问题根源
mode="primary"配置错误
这个属性会将当前视图设置为主视图,直接替换掉父视图(purchase_order_form_extend),而非在其基础上做继承修改,导致你的自定义字段权限逻辑完全失效。attrs语法与逻辑问题
Odoo的attrs需要使用域(domain)格式做条件判断,直接写{'readonly': 0}不是合法语法;同时你试图通过双视图拆分权限,但组权限的应用逻辑不正确,非admin用户仍会加载只读视图,而admin视图因mode错误无法覆盖。
正确解决方案
方法一:单视图结合组条件动态控制
直接在添加字段的视图中,通过attrs判断用户所属组,动态设置只读权限:
<record id="purchase_order_form_extend" model="ir.ui.view"> <field name="name">purchase.order.form.extend</field> <field name="model">purchase.order</field> <field name="inherit_id" ref="purchase.purchase_order_form"/> <field name="arch" type="xml"> <field name="partner_ref" position="after"> <field name="custom_field" attrs="{'readonly': [('user_id.groups_id', 'not in', [ref('base.group_system')])]}"/> </field> </field> </record>
注:
base.group_system是admin组的系统标识,比直接引用base.user_admin更准确,因为admin用户默认属于该组。
方法二:双视图正确继承+组权限控制
如果坚持拆分视图,需移除mode="primary",确保admin视图以扩展模式继承并仅对admin组可见:
<!-- 基础视图:所有用户默认只读 --> <record id="purchase_order_form_extend" model="ir.ui.view"> <field name="name">purchase.order.form.extend</field> <field name="model">purchase.order</field> <field name="inherit_id" ref="purchase.purchase_order_form"/> <field name="arch" type="xml"> <field name="partner_ref" position="after"> <field name="custom_field" readonly="1"/> </field> </field> </record> <!-- Admin专属视图:覆盖为可编辑 --> <record id="view_order_form_custom_readonly" model="ir.ui.view"> <field name="name">purchase.order.form.readonly.custom</field> <field name="model">purchase.order</field> <field name="inherit_id" ref="purchase_order_form_extend"/> <field name="groups_id" eval="[(6, 0, [ref('base.group_system')])]"/> <field name="arch" type="xml"> <field name='custom_field' position="attributes"> <attribute name="readonly">0</attribute> </field> </field> </record>
额外注意事项
- 模块升级后,务必清除浏览器缓存并重新登录,Odoo的视图缓存可能导致修改不生效。
- 确认admin用户确实属于
base.group_system组(默认admin已加入该组)。
内容的提问来源于stack exchange,提问作者Ing
相关产品推荐
相关产品推荐

