如何在Odoo 16中从表单视图传递Context到Python变量?
Odoo 16 上下文(Context)获取与更新问题解决方案
一、视图中Context的作用误区
你在视图字段上设置的context仅作用于该字段的特定交互场景,比如:
- 点击字段下拉框时过滤选项
- 从该字段创建关联记录时传递上下文
- 打开字段的关联视图时携带参数
它不会自动全局注入到模型的env.context中。比如你在journal_id字段设置context={'journal_id':7},只有在操作这个字段时该上下文才生效,打开表单时全局env.context不会包含这个值。
二、正确获取上下文的方式
1. 直接读取字段值(推荐)
如果你的目标是获取当前银行对账单的journal_id,不需要从上下文取,直接读取模型字段即可:
journal_id = self.journal_id.id if self.journal_id else False
2. 传递上下文到目标场景
如果确实需要传递上下文到模型方法或子记录:
(1)在One2Many字段传递父记录值
修改视图中line_ids的tree上下文,传递父记录的journal_id:
<tree string="Bank Statement Lines" editable="bottom" context="{'o2m_active_model': 'account.bank.statement', 'parent_journal_id': parent.journal_id}">
之后在account.bank.statement.line模型的方法中就能获取:
parent_journal_id = self.env.context.get('parent_journal_id', False)
(2)通过按钮传递上下文
如果是通过按钮触发方法,在视图的按钮上设置context:
<button name="my_method" string="执行方法" context="{'journal_id': journal_id}"/>
(3)代码中手动传递上下文
调用方法时使用with_context()创建新的上下文环境:
# 合并现有上下文并添加新值 new_context = dict(self.env.context, journal_id=self.journal_id.id) result = self.with_context(new_context).my_custom_method() # 或者直接添加单个值 self = self.with_context(journal_id=7) # 后续方法中可通过self.env.context.get('journal_id')获取
三、处理Odoo 16的Frozendict
Odoo 16中self.env.context是不可变的frozendict,无法直接修改,但你可以通过以下方式创建新的上下文:
1. 合并现有上下文与新参数
# 将现有上下文转为普通字典,再添加新值 updated_context = dict(self.env.context) updated_context['journal_id'] = 7 # 创建带新上下文的环境 new_env = self.env.with_context(updated_context)
2. 链式调用简化写法
# 直接添加或覆盖上下文参数 self.with_context(journal_id=7).search([('journal_id', '=', self.env.context.get('journal_id'))])
四、针对你的代码修正示例
如果是想在account.bank.statement模型方法中获取当前记录的journal_id,直接读取字段即可:
# 替换原代码 journal_id = self.journal_id.id if self.journal_id else False
如果需要在子记录(line_ids)中获取父记录的journal_id,修改视图的One2Many上下文后,在子模型中读取:
# 在account.bank.statement.line模型中 parent_journal_id = self.env.context.get('parent_journal_id', False)
内容的提问来源于stack exchange,提问作者Faris Ponighzwa
相关产品推荐
相关产品推荐

