odoo many2one或many2many字段动态domain的两种方法

需求描述:

有一个表单,上面有两个关键字段:

type = fields.Selection([('customer','客户'),('supplier','供应商')])
partner_id = fields.Many2one('res.partner', string='联系人')

用户希望在选择type的时候根据type的值动态设置partner_id的取值范围

解决方案:

1. 在on_change中动态更改domain

odoo many2one或many2many字段动态domain的两种方法_第1张图片
odoo官方文档中关于on_change部分

官方文档中on_change返回的字典中可以包含两个值:

  1. domain字典
  2. warning
res = {
  'domain':{field: domain},
  'warning':'Warning Message'
}

具体操作如下:

  1. 在视图上根据type的默认值为partner_id写好domain,无默认值可忽略这一步
  2. 在后台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

  1. 在xml中type的定义处加入属性context="{'type':type}"
  2. 重写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

你可能感兴趣的:(odoo many2one或many2many字段动态domain的两种方法)