Odoo 10表单提交无法正确存储当前会话用户ID问题求助
解决Odoo中Many2one字段默认值始终为管理员的问题
嘿,我之前也踩过一模一样的坑!咱们一步步来排查和解决这个问题:
可能的原因&对应解决方案
1. 模型/字段权限不足
如果普通用户对你的邮件模型没有创建/写入权限,或者user_id字段被设置为不可写,Odoo可能会自动用管理员身份(ID=1)填充这个字段。
排查步骤:
- 进入「设置」→「技术」→「模型」,找到你的邮件模型(比如
mail.custom_mail) - 查看对应的「访问权限」记录,确保普通用户所属的用户组拥有「创建」和「写入」权限
- 再检查「记录规则」,有没有针对
user_id字段的强制规则(比如强制绑定管理员),如果有就调整或删除
2. 重写create方法时覆盖了默认值
如果你在邮件模型的Python代码里重写了create方法,不小心硬编码了user_id的值,就会完全覆盖你设置的default逻辑。
比如这种错误写法:
def create(self, vals): # 硬编码会强制把user_id设为管理员 vals['user_id'] = 1 return super().create(vals)
修正方法:只在vals里没有user_id值的时候才补充默认值,或者直接保留原default的逻辑:
def create(self, vals): # 仅当用户未指定user_id时,使用当前登录用户 if not vals.get('user_id'): vals['user_id'] = self.env.user.id return super().create(vals)
3. 表单视图的字段设置异常
虽然你的字段定义没问题,但如果表单视图里的user_id字段被设置了特殊属性,也可能导致异常:
- 检查视图里的
user_id字段是否设置了readonly="1"但未保留默认值传递逻辑 - 确保没有使用
force_save="1"这类可能干扰字段值的属性
4. 浏览器缓存或会话异常
有时候浏览器缓存的旧会话会导致上下文错乱,试试用隐私模式登录不同用户测试,排除缓存问题。
确认字段定义正确性
先确保你的字段写法本身没问题,推荐加上required=True强制字段赋值,方便测试:
user_id = fields.Many2one('res.users', string='发送用户', default=lambda self: self.env.user, required=True)
最终验证方式
创建一条邮件记录后,直接查看数据库对应的表(比如模型是mail.custom_mail,表名就是mail_custom_mail),观察user_id字段的实际值:
- 如果数据库里是正确的用户ID,但界面显示管理员,那是视图或权限的问题
- 如果数据库里就是管理员ID=1,那肯定是后端逻辑或权限的问题
按照上面的步骤排查,应该很快就能定位到问题啦!
内容的提问来源于stack exchange,提问作者user9471328
相关产品推荐
相关产品推荐

