Odoo 14社区版:如何按条件控制One2Many字段树的创建/删除权限?
解决Odoo 14社区版One2Many树视图动态控制创建/删除权限的问题
方法一:模型层通过上下文判断控制权限(安全可靠)
这种方法从业务逻辑层面拦截创建和删除操作,即使通过其他入口(如批量操作)也无法绕过限制。
- 在父表单视图中传递父记录状态到上下文
修改One2Many字段的定义,将父记录的状态传入子记录的上下文:
<field name="lines" context="{'parent_state': state}"/>
- 在子模型中重写create和unlink方法
在子模型的Python代码中,根据上下文里的父状态判断是否允许操作:
from odoo import models, UserError class YourLineModel(models.Model): _name = 'your.line.model' _description = '子行记录模型' def create(self, vals): # 示例:父记录状态为'done'时禁止创建 if self.env.context.get('parent_state') == 'done': raise UserError("父记录已完成,无法创建新的行记录") return super().create(vals) def unlink(self): # 示例:父记录状态为'done'时禁止删除 if self.env.context.get('parent_state') == 'done': raise UserError("父记录已完成,无法删除行记录") return super().unlink()
方法二:视图层切换不同权限的Tree视图(直观便捷)
通过定义两个不同权限的Tree视图,根据父记录状态动态切换显示,仅在视图层面隐藏创建/删除按钮。
- 定义两个Tree视图
分别创建允许操作和禁止操作的Tree视图:
<!-- 允许创建/删除的Tree视图 --> <record id="view_line_tree_editable" model="ir.ui.view"> <field name="name">your.line.model.tree.editable</field> <field name="model">your.line.model</field> <field name="arch" type="xml"> <tree editable="bottom" create="1" delete="1"> <!-- 子行字段定义 --> <field name="field1"/> <field name="field2"/> <!-- 其他字段 --> </tree> </field> </record> <!-- 禁止创建/删除的Tree视图 --> <record id="view_line_tree_readonly" model="ir.ui.view"> <field name="name">your.line.model.tree.readonly</field> <field name="model">your.line.model</field> <field name="arch" type="xml"> <tree editable="bottom" create="0" delete="0"> <!-- 与上面相同的字段定义 --> <field name="field1"/> <field name="field2"/> <!-- 其他字段 --> </tree> </field> </record>
- 在父表单视图中动态切换视图
使用attrs属性根据父记录状态切换对应的Tree视图:
<field name="lines" attrs="{'views': [('view_line_tree_readonly', 'tree')] if state == 'done' else [('view_line_tree_editable', 'tree')]}"/>
方法对比
- 方法一:安全性高,全面拦截所有创建/删除操作,但需要编写Python代码。
- 方法二:无需修改Python逻辑,仅通过XML配置实现,适合快速需求,但用户若通过其他途径(如API)操作仍可绕过视图限制。
内容的提问来源于stack exchange,提问作者holydragon
相关产品推荐
相关产品推荐

