使用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加载视图时会解析所有字段的权限配置:
- 非组用户没有
vendor_connector_ids字段的访问权限(读/写权限),即使字段在隐藏容器内,Odoo依然会检查该字段的权限,触发Access Error。 - 字段的
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
相关产品推荐
相关产品推荐

