You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 16中如何通过XML按用户组设置字段只读权限?

问题分析与解决方案

问题根源

  1. mode="primary" 配置错误
    这个属性会将当前视图设置为主视图,直接替换掉父视图(purchase_order_form_extend),而非在其基础上做继承修改,导致你的自定义字段权限逻辑完全失效。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:45:23