Odoo 17中onchange方法返回字段域失效问题求助(兼容v14代码)
解决Odoo 17中onchange返回字段域失效的问题
在Odoo 17中,原有通过onchange方法返回{'domain': ...}的方式不再生效,这是因为新版本更换了前端OWL框架,同时调整了后端onchange的处理逻辑,尤其是针对临时模型(TransientModel)。针对你的需求,推荐以下两种解决方案:
方案一:直接在字段定义中绑定动态域(最优解)
不需要编写onchange方法,直接在service_request_ids的字段定义里设置动态domain,利用当前模型的service_id字段做关联过滤,Odoo 17会自动处理前端的实时更新:
class ChooseDeliveryCarrier(models.TransientModel): _inherit = 'choose.delivery.carrier' service_id = fields.Many2one('ahamove.service', string='Service') service_request_ids = fields.Many2many( 'ahamove.service.request', 'estimate_request_rel', 'choose_id', 'request_id', string='Request Type', # 动态关联当前选中的service_id,自动过滤对应选项 domain="[('service_id', '=', service_id)]" )
方案二:使用计算域实现复杂逻辑(适用于多条件过滤场景)
如果需要根据更多复杂条件动态调整域,可以通过@api.depends装饰器结合fields.Domain来计算字段域:
from odoo.fields import Domain class ChooseDeliveryCarrier(models.TransientModel): _inherit = 'choose.delivery.carrier' service_id = fields.Many2one('ahamove.service', string='Service') service_request_ids = fields.Many2many( 'ahamove.service.request', 'estimate_request_rel', 'choose_id', 'request_id', string='Request Type', domain="_compute_service_request_domain" ) @api.depends('service_id') def _compute_service_request_domain(self): for rec in self: if rec.service_id: rec.service_request_ids.domain = Domain([('service_id', '=', rec.service_id.id)]) else: # 未选择服务时清空域,显示所有选项(或根据需求设置其他域) rec.service_request_ids.domain = Domain([])
注意事项
- 确保在对应的视图中,
service_id和service_request_ids字段都正常渲染,没有被设置invisible或其他影响交互的属性; - 方案一已经能满足你的基础需求,无需额外编写onchange方法,代码更简洁且符合Odoo 17的设计规范。
内容的提问来源于stack exchange,提问作者Tangerine
相关产品推荐
相关产品推荐

