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 字段也会显示出来
要实现输入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 就可以把搜索到想要的记录了