Odoo11重写name_get时self.env.uid仅返回超级管理员ID求助
解决Odoo 11中name_get方法里self.env.uid始终返回超级管理员ID的问题
首先得搞清楚为什么会出现这个情况——大概率是你的name_get方法被系统在超级管理员的环境上下文里调用了,比如某些内部自动流程、权限受限的视图渲染,或者其他模块用sudo()强制切换了环境,导致当前环境的uid被覆盖成管理员ID了。
给你几个可行的解决思路,按优先级来:
1. 从上下文里获取真实用户ID
Odoo的上下文(context)里通常会保留原始的用户ID,哪怕当前环境被sudo()切换了。你可以尝试从上下文里提取真实uid,替代直接用self.env.uid:
@api.multi def name_get(self): result = [] # 优先从上下文取真实用户ID, fallback到当前环境uid real_uid = self.env.context.get('uid', self.env.uid) user = self.env['res.users'].browse(real_uid) for record in self: # 这里替换成你的组判断逻辑 if user.has_group('base.group_user'): display_name = record.full_name else: display_name = record.name result.append((record.id, display_name)) return result
2. 检查是否被其他模块的sudo调用覆盖
有些模块在处理公司数据时,会用sudo()来确保权限(比如系统设置相关的操作),这会导致你的name_get在管理员环境下执行。你可以:
- 查看模块的加载顺序,确保你的自定义模块在可能修改
res.company的模块之后加载(在__manifest__.py的depends里调整顺序); - 检查是否有其他模块继承了
res.company的name_get方法,并且用了sudo(),如果有的话,你可能需要重写优先级更高的方法,或者修改那个模块的逻辑。
3. 改用计算字段分离逻辑
如果直接在name_get里判断用户组容易受环境影响,你可以把显示逻辑放到计算字段里,再在name_get里返回这个字段:
class ResCompanyCustom(models.Model): _inherit = "res.company" full_name = fields.Char(string='Company Full Name') # 新增计算字段处理不同用户组的显示 display_name_custom = fields.Char(compute='_compute_display_name_custom') @api.multi def _compute_display_name_custom(self): real_uid = self.env.context.get('uid', self.env.uid) user = self.env['res.users'].browse(real_uid) for record in self: if user.has_group('base.group_user'): record.display_name_custom = record.full_name else: record.display_name_custom = record.name @api.multi def name_get(self): result = [] for record in self: result.append((record.id, record.display_name_custom)) return result
4. 确认测试场景的正确性
有时候可能是你测试时的场景问题:比如你用管理员用户登录系统查看公司数据,那self.env.uid自然是管理员ID。记得切换到普通用户账号测试,看看问题是否依然存在。
内容的提问来源于stack exchange,提问作者Tamir Tsedev




