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

使用groups属性隐藏元素仍触发Odoo访问错误,用户被拦截

问题描述

给product.template表单视图扩展了一个新的笔记本页,原本打算通过groups属性隐藏该页面(仅隐藏元素,不拦截其他用户),但不符合预期:非vendor_eshop_connector.vendor_connector_group_user组的用户打开产品表单时,会触发Access Error,页面虽已隐藏但用户仍被拦截。

定位到问题出在页面内的vendor_connector_ids字段,注释该字段后恢复正常。相关代码如下:

问题字段及模型定义

# 问题字段
vendor_connector_ids = fields.Many2many(comodel_name="vendor.connector", string="Vendor Connectors")

# 关联布尔字段
can_be_tracked = fields.Boolean(string="Can be Tracked")

简化后的表单视图

<record id="product_template_form_view" model="ir.ui.view">
    <field name="name">product.template.form.view.inherit.substitutes</field>
    <field name="model">product.template</field>
    <field name="inherit_id" ref="product.product_template_only_form_view"/>
    <field name="arch" type="xml">

        <div name="options" position="inside">
            <div groups="vendor_eshop_connector.vendor_connector_group_user">
                <field name="can_be_tracked"/>
                <label for="can_be_tracked" string="Has Substitutes"/>
            </div>
        </div>
        
        <!-- Other elements here -->

        <notebook position="inside">
            <page name="vendor_tracking"
                  string="Substitutes and Suppliers"
                  groups="vendor_eshop_connector.vendor_connector_group_user"
                  attrs="{'invisible' : [('can_be_tracked', '=', False)]}">

                <group name="tracking" >
                    
                    <group string="Suppliers" name="vendor_connectors">
                        <!-- THIS FIELD HERE IS THE PROBLEM -->
                        <field name="vendor_connector_ids"
                               widget="many2many_checkboxes"
                               attrs="{'required' : [('can_be_tracked', '=', True)]}"
                        />
                    </group>
                        <!-- Other elements here -->
                    <group>
                        <!-- Other elements here -->                           
                    </group>
                </group>
            </page>
        </notebook>
    </field>
</record>
问题原因

虽然页面通过groups属性隐藏,但Odoo加载视图时会解析所有字段的权限配置:

  1. 非组用户没有vendor_connector_ids字段的访问权限(读/写权限),即使字段在隐藏容器内,Odoo依然会检查该字段的权限,触发Access Error。
  2. 字段的attrs规则(required)会被Odoo评估,非组用户因无法访问字段,导致规则校验失败,进而触发错误。
解决方案

方法1:给字段添加组权限控制

在模型的字段定义中,给vendor_connector_ids加上groups属性,限制只有指定组能访问该字段:

vendor_connector_ids = fields.Many2many(
    comodel_name="vendor.connector", 
    string="Vendor Connectors",
    groups="vendor_eshop_connector.vendor_connector_group_user"
)

方法2:在视图中给字段添加groups属性

如果不想修改模型定义,直接在视图的字段标签上添加groups属性,和页面的组一致:

<field name="vendor_connector_ids"
       widget="many2many_checkboxes"
       attrs="{'required' : [('can_be_tracked', '=', True)]}"
       groups="vendor_eshop_connector.vendor_connector_group_user"
/>

额外注意事项

  • 确保vendor.connector模型的权限配置合理:如果非组用户不需要访问该模型,无需额外配置;若需要,则给对应组添加该模型的访问权限。
  • 因can_be_tracked字段已经通过groups限制可见,字段的required规则只会对指定组用户生效,无需额外调整。

内容的提问来源于stack exchange,提问作者xixo222

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:47:12