需求描述:
有一个表单,上面有两个关键字段:
type = fields.Selection([('customer','客户'),('supplier','供应商')])
partner_id = fields.Many2one('res.partner', string='联系人')
用户希望在选择type的时候根据type的值动态设置partner_id的取值范围
解决方案:
1. 在on_change中动态更改domain
官方文档中on_change返回的字典中可以包含两个值:
- domain字典
- warning
res = {
'domain':{field: domain},
'warning':'Warning Message'
}
具体操作如下:
- 在视图上根据type的默认值为partner_id写好domain,无默认值可忽略这一步
- 在后台
model.py
文件中加入以下程序
@api.model
def _onchange_type(self):
domain = [('customer','=',1)] if self.type == 'customer' else [('supplier','=',1)]
return {
'domain': {'partner_id': domain}
}
2. 重写name_search
- 在xml中type的定义处加入属性
context="{'type':type}"
- 重写res.partner的name_search方法
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
if 'type' in self.env.context:
type = self.env.context['type']
args.append((type , '=', 1))
return super(WeChatPermission, self).name_search(name, args, operator, limit)
参考:
Odoo ORM API: https://www.odoo.com/documentation/11.0/reference/orm.html