Odoo 17按州筛选区县:onchange方法失效求助
解决Odoo中State选择后District未过滤的问题
问题根源分析
你的onchange方法失效大概率是两个原因:
- XML视图仍保留了旧计算字段的
domain="domain_district"属性,覆盖了onchange设置的域名 - 若用户无
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
相关产品推荐
相关产品推荐

