需求描述:
有一個(gè)表單樊拓,上面有兩個(gè)關(guān)鍵字段:
type = fields.Selection([('customer','客戶'),('supplier','供應(yīng)商')])
partner_id = fields.Many2one('res.partner', string='聯(lián)系人')
用戶希望在選擇type的時(shí)候根據(jù)type的值動(dòng)態(tài)設(shè)置partner_id的取值范圍
解決方案:
1. 在on_change中動(dòng)態(tài)更改domain
odoo官方文檔中關(guān)于on_change部分
官方文檔中on_change返回的字典中可以包含兩個(gè)值:
- domain字典
- warning
res = {
'domain':{field: domain},
'warning':'Warning Message'
}
具體操作如下:
- 在視圖上根據(jù)type的默認(rèn)值為partner_id寫(xiě)好domain,無(wú)默認(rèn)值可忽略這一步
- 在后臺(tái)
model.py
文件中加入以下程序
@api.model
def _onchange_type(self):
domain = [('customer','=',1)] if self.type == 'customer' else [('supplier','=',1)]
return {
'domain': {'partner_id': domain}
}
2. 重寫(xiě)name_search
- 在xml中type的定義處加入屬性
context="{'type':type}"
- 重寫(xiě)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