如何在表单视图中禁止移除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
相关产品推荐
相关产品推荐

