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

如何在表单视图中禁止移除Many2many字段的关联元素?

实现Many2many字段仅允许添加、禁止移除的方案

完全可以实现这个需求,推荐从视图层界面控制和模型层安全校验两个层面入手,兼顾用户体验和数据安全:

1. 视图层:隐藏删除按钮,阻止界面操作

在表单视图的Many2many字段定义中,通过options参数禁用删除功能,界面上的删除按钮会被直接隐藏,普通用户无法通过表单操作移除学生。

示例代码(XML视图):

<!-- 以many2many_tags组件为例 -->
<field name="student_ids" widget="many2many_tags" options='{"no_delete": true}'/>

<!-- 如果是内嵌tree视图的many2many字段 -->
<field name="student_ids">
    <tree editable="bottom" options='{"no_delete": true}'>
        <!-- 树视图字段定义 -->
        <field name="name"/>
        <field name="age"/>
    </tree>
</field>

2. 模型层:拦截删除操作,防止非法修改

仅靠视图控制不够彻底(比如用户可能通过API、批量操作等绕过界面限制),需要在模型的write方法中校验字段修改,直接拦截移除学生的操作。

示例代码(Python模型):

from odoo import models, fields, api, exceptions

class YourModel(models.Model):
    _name = 'your.model.name'
    _description = '你的模型名称'

    student_ids = fields.Many2many('res.partner', string='学生列表')  # 假设学生是res.partner模型,根据实际调整

    def write(self, vals):
        # 检查是否修改了student_ids字段
        if 'student_ids' in vals:
            for operation in vals['student_ids']:
                op_type = operation[0]
                # Odoo的Many2many操作类型:3=删除单个,5=清空所有,6=替换列表(这些都是移除操作)
                if op_type in (3, 5, 6):
                    raise exceptions.UserError("不允许移除已添加的学生")
        return super(YourModel, self).write(vals)

注意事项

  • 视图层的no_delete参数对不同组件(如many2many_tags、内嵌tree视图)都有效,根据你的实际使用组件调整即可。
  • 模型层的校验会拦截所有修改student_ids的删除类操作,确保数据不会被非法篡改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:55:16