如何在Odoo的Many2many字段中显示「员工(部门)」格式
实现Odoo中many2many字段「员工姓名(部门名称)」的显示格式
核心思路
Odoo的many2many_tags组件会调用关联模型的name_get()方法生成显示文本,所以只需修改hr.employee模型的该方法,就能实现目标格式。
方法一:全局修改员工显示格式
此方法会让所有关联hr.employee的字段都显示「姓名(部门)」格式。
1. 在自定义模块的模型文件中重写name_get方法
找到你自定义模块下的Python模型文件(如hr_employee_extend.py),添加以下代码:
from odoo import models, api class HrEmployee(models.Model): _inherit = 'hr.employee' @api.multi def name_get(self): result = [] for employee in self: # 处理无部门的情况,避免空括号 dept_name = employee.department_id.name if employee.department_id else "" display_text = f"{employee.name} ({dept_name})" if dept_name else employee.name result.append((employee.id, display_text)) return result
2. 保留原有XML配置
你的现有XML代码无需修改,继续使用即可:
<field name="employee_ids" widget="many2many_tags" />
3. 验证效果
升级你的自定义模块后,打开对应表单,就能看到employee_ids的标签显示为「员工姓名(部门名称)」格式。
方法二:仅针对当前字段修改(不全局影响)
如果不想改变其他地方的员工显示格式,可通过上下文控制仅当前字段生效。
1. 修改XML配置,添加上下文标记
<field name="employee_ids" widget="many2many_tags" context="{'show_dept_in_name': True}" />
2. 重写name_get方法时判断上下文
from odoo import models, api class HrEmployee(models.Model): _inherit = 'hr.employee' @api.multi def name_get(self): result = [] # 读取上下文标记,决定是否显示部门 show_dept = self.env.context.get('show_dept_in_name', False) for employee in self: if show_dept: dept_name = employee.department_id.name if employee.department_id else "" display_text = f"{employee.name} ({dept_name})" if dept_name else employee.name else: # 调用原生方法保持原有显示 display_text = super(HrEmployee, employee).name_get()[0][1] result.append((employee.id, display_text)) return result
内容的提问来源于stack exchange,提问作者Kai Ning
相关产品推荐
相关产品推荐

