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

Odoo 17按州筛选区县:onchange方法失效求助

解决Odoo中State选择后District未过滤的问题

问题根源分析

你的onchange方法失效大概率是两个原因:

  1. XML视图仍保留了旧计算字段的domain="domain_district"属性,覆盖了onchange设置的域名
  2. 若用户无res.country.district模型的读权限,直接用条件域名无法返回可见记录(原计算字段用了sudo()绕过权限)

修复步骤

1. 清理旧代码

删除原计算字段及对应的计算方法:

# 移除以下代码
# domain_district = fields.Char(compute='_compute_domain_district')

# @api.depends('state_id')
# def _compute_domain_district(self):
#     for rec in self:
#         if rec.state_id:
#             districts = self.env['res.country.district'].sudo().search([('state_id', '=', rec.state_id.id)])
#             domain = [('id', 'in', districts.ids)] if districts else []
#         else:
#             domain = []
#         rec.domain_district = json.dumps(domain)

2. 更新onchange方法

调整方法逻辑,保留原sudo()权限处理(若不需要可移除),并添加清理无效区县的逻辑:

state_id = fields.Many2one('res.country.state', string='State')
district_id = fields.Many2one('res.country.district', string='District')

@api.onchange('state_id')
def _onchange_state_id(self):
    if self.state_id:
        # 用sudo()确保获取全部区县记录(匹配原逻辑)
        districts = self.env['res.country.district'].sudo().search([('state_id', '=', self.state_id.id)])
        district_ids = districts.ids if districts else []
        
        # 若当前选中的区县不属于新州,清空选择
        if self.district_id and self.district_id.id not in district_ids:
            self.district_id = False
            
        return {
            'domain': {
                'district_id': [('id', 'in', district_ids)]
            }
        }
    else:
        # 清空州时重置区县和域名
        self.district_id = False
        return {
            'domain': {
                'district_id': []
            }
        }

3. 修改XML视图

移除district_id字段的domain="domain_district"属性:

<field name="state_id" string="State"/>
<field name="district_id" placeholder="District" nolabel="1"/>

可选优化

若用户拥有res.country.district的读权限,可简化onchange方法,直接用条件域名而非ID列表:

@api.onchange('state_id')
def _onchange_state_id(self):
    if self.state_id:
        if self.district_id and self.district_id.state_id != self.state_id:
            self.district_id = False
        return {
            'domain': {
                'district_id': [('state_id', '=', self.state_id.id)]
            }
        }
    else:
        self.district_id = False
        return {
            'domain': {
                'district_id': []
            }
        }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:05:25