odoo 中实现多列搜索

odoo 中很多many2one字段很多都有需求要显示 name+description的。

类:

class vp_project(models.Model):
    _name='vp.project'
    _inherit = ['mail.thread', 'ir.needaction_mixin']
    _discription='VP project'
    
    
    name=fields.Char('VP NO.',  required=True,select=True, copy=False)
    applicant= fields.Char('Contact')
    description= fields.Text('Description')
    project_name=fields.Char('Project Name', select=True, copy=False)
    customer = fields.Many2one('res.partner','Customer',required=True, domain=[('customer', '=', True)])


另一个类中有一个字段many2one 

vp_project = fields.Many2one('vp.project', string='VP Project',  states=READONLY_STATES, required=True, track_visibility='always')


在视图中当对字段vp_project进行下拉选择的时候一般时候只会显示name。 即 vp.project 里面的name

有些需求就是要下拉选择的时候能看的project_name. 因为这个vp number只是一个编号不能确定是不是所选的。

要想实现这个功能就要在类 vp_project 里面添加方法

  @api.multi
    @api.depends('name', 'project_name')
    def name_get(self):
        return [(r.id, (r.name +'(' + (r.project_name or _('Default'))+')' )) for r in self]

 下拉选择效果, 就会把project_name 字段也会显示出来

  odoo 中实现多列搜索_第1张图片

要实现输入project name 能搜索到想要的字段只有这样还不可以。 比如现在输入SW 第一个project不会被过滤出来。 

要想实现多列搜索 得在类中再添加一个方法:

  @api.model
    def name_search(self, name='', args=None, operator='ilike', limit=100):
        args = args or []
        domain = []
        if name:
            domain = ['|', ('name', operator, name), ('project_name', operator, name)]
        pos = self.search(domain + args, limit=limit)
        return pos.name_get()

这样输入project name 就可以把搜索到想要的记录了

odoo 中实现多列搜索_第2张图片


你可能感兴趣的:(openerp,odoo)