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

Odoo 14社区版:如何按条件控制One2Many字段树的创建/删除权限?

解决Odoo 14社区版One2Many树视图动态控制创建/删除权限的问题

方法一:模型层通过上下文判断控制权限(安全可靠)

这种方法从业务逻辑层面拦截创建和删除操作,即使通过其他入口(如批量操作)也无法绕过限制。

  1. 在父表单视图中传递父记录状态到上下文
    修改One2Many字段的定义,将父记录的状态传入子记录的上下文:
<field name="lines" context="{'parent_state': state}"/>
  1. 在子模型中重写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视图,根据父记录状态动态切换显示,仅在视图层面隐藏创建/删除按钮。

  1. 定义两个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>
  1. 在父表单视图中动态切换视图
    使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:38