You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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__.pydepends里调整顺序);
  • 检查是否有其他模块继承了res.companyname_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

火山引擎 最新活动