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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:35:59