Odoo中One2many字段视图属性随Selection切换不生效的优化方案咨询
针对你遇到的Odoo向导中One2many字段属性切换不刷新的问题,给你一套更简洁的优化方案,不用新增冗余字段就能解决:
更优实现方案:动态控制One2many字段属性
核心解决思路
利用Odoo原生的字段动态属性绑定和视图上下文联动,结合模型层的onchange逻辑,直接实现Type切换时Route字段的权限控制,避免冗余字段带来的复杂度。
1. 模型层逻辑优化
不用新增额外字段,直接在onchange_type方法里处理默认路由的填充,同时确保切换Type时逻辑触发:
class YourWizard(models.TransientModel): _name = 'your.wizard' _description = 'Your Wizard' type = fields.Selection([('type1', 'Type 1'), ('type2', 'Type 2')], string='Type', required=True) route_ids = fields.One2many('your.route.model', 'wizard_id', string='Routes') @api.onchange('type') def onchange_type(self): if self.type == 'type2': # 先清空现有路由,再填充系统默认值 self.route_ids = [(5, 0, 0)] default_routes = self._get_default_routes() self.route_ids = [(0, 0, vals) for vals in default_routes] # Type1时保留原有记录,或按需清空,自行调整 def _get_default_routes(self): # 自定义方法返回默认路由的字典列表 return [ {'name': '默认路由1', 'sequence': 1}, {'name': '默认路由2', 'sequence': 2}, ]
2. 视图层动态控制权限
在XML视图中,直接给One2many字段和其tree视图绑定动态属性,通过attrs关联Type字段的值,切换时自动刷新状态:
<field name="route_ids" attrs="{'readonly': [('type', '=', 'type2')]}"> <tree editable="bottom"> <!-- 动态控制tree的新增/删除按钮显示 --> <attribute name="create" attrs="{'invisible': [('type', '=', 'type2')]}"/> <attribute name="delete" attrs="{'invisible': [('type', '=', 'type2')]}"/> <field name="name"/> <field name="sequence"/> </tree> </field>
如果你的Odoo版本对tree标签的attrs支持有限,也可以用fields_view_get动态修改视图属性作为备选:
@api.model def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): res = super(YourWizard, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) if view_type == 'form': doc = etree.XML(res['arch']) # 获取当前向导的Type值(新建时取默认值,编辑时取当前值) current_type = self.env.context.get('default_type') or self.type for tree_node in doc.xpath("//field[@name='route_ids']/tree"): if current_type == 'type2': tree_node.set('create', '0') tree_node.set('delete', '0') else: tree_node.set('create', '1') tree_node.set('delete', '1') res['arch'] = etree.tostring(doc) return res
3. 关键注意点
- 优先用视图层的
attrs绑定方案,更轻量化,符合Odoo原生设计,避免重写fields_view_get。 - 确保
onchange_type方法在Type切换时自动触发,Odoo默认会处理字段变更的onchange事件。 - Type2时同时控制One2many字段的
readonly和tree的create/delete属性,彻底禁止手动修改。
方案优势
- 无冗余字段,模型结构更简洁,维护成本更低。
- 视图与模型逻辑联动,切换Type时属性自动刷新,解决之前的状态残留问题。
- 完全基于Odoo原生能力实现,兼容性更好。
内容的提问来源于stack exchange,提问作者Bhavesh Odedra
相关产品推荐
相关产品推荐

