上下文(context)在odoo14中的作用以及功能。并举例说明 。最后再总结一下。所能用到的场景。并归纳总结
在 Odoo 中,上下文(context)是一个非常重要的概念。Context 是一个 Python 字典,它在各种方法之间传递,并且可以影响这些方法的行为。
Context 的主要作用和功能:
-
传递参数:在执行方法的过程中,可以通过 context 传递参数。这些参数可以影响方法的行为。
-
本地化:context 中有一些特殊的关键字,可以用来设置当前用户的语言、时区等信息,从而实现本地化。
-
缺省值:context 中的 'default_' 关键字可以用来设置创建新记录时的缺省值。
-
环境信息:context 中还可以保存一些环境信息,比如当前用户的公司、当前的日期等。
举例说明:
1、传递参数:
# 使用 context 传递 'no_reset_password' 参数 self.env['res.users'].with_context(no_reset_password=True).create(vals)
在这个例子中,我们在创建新用户的时候,通过 context 传递 'no_reset_password' 参数,告诉 create
方法不需要重置密码。
假设你正在写一个定时任务,该任务需要在特定时间执行一些特殊操作。你可以使用 context 传递一个标记给方法,告诉它这是一个定时任务,不需要执行一些通常的检查。
# 使用 context 传递 'is_scheduled_task' 参数 self.env['my.model'].with_context(is_scheduled_task=True).my_method()
在 my_method
中,你可以检查 'is_scheduled_task' 参数,并根据它的值改变你的逻辑。
问:self.env['my.model'].with_context(is_scheduled_task=True).my_method() 这句中的is_scheduled_task是字段名吗?
答:
在这个例子中,is_scheduled_task
不是一个字段名,而是我们通过上下文(context)传递的一个参数名。with_context
方法允许你添加或者更新上下文中的键值对。你可以把任何你想要传递的信息作为键值对添加到上下文中。
在这个特定的例子中,我们添加了一个名为 is_scheduled_task
的参数,并把它的值设置为 True
。然后在 my_method
方法中,我们可以通过 self.env.context.get('is_scheduled_task')
来获取这个参数的值。如果 is_scheduled_task
参数的值为 True
,那么我们就知道这个方法是在执行定时任务的过程中被调用的。
需要注意的是,你可以使用任何你喜欢的字符串作为参数名,只要它在你的应用中是唯一的。也就是说,你需要确保你的参数名不会和 Odoo 内置的参数名或者其他模块的参数名冲突。这就是为什么我们在这个例子中使用了 is_scheduled_task
这个相对较长和特定的参数名,而不是简单的 scheduled
或者 task
。
2、设置缺省值:
# 使用 context 设置 'default_name' 缺省值 self.env['res.partner'].with_context(default_name='John').create(vals)
在这个例子中,我们在创建新合作伙伴的时候,通过 context 设置 'default_name' 缺省值为 'John'。
假设你正在为一个商店创建新的产品,你可能希望所有的新产品默认都是可销售的。你可以使用 context 设置 'default_sale_ok' 参数。
# 使用 context 设置 'default_sale_ok' 缺省值 self.env['product.product'].with_context(default_sale_ok=True).create(vals)
在这个例子中,所有新创建的产品都将默认为可销售。
3、本地化:
假设你正在为一个多语言的应用编写代码,你可能需要在每个请求中设置用户的语言。这样,你就可以确保每个用户都看到的是他们自己的语言。
# 使用 context 设置 'lang' 参数 self.env['res.partner'].with_context(lang='fr_FR').name_get()
在这个例子中,name_get
方法将会以法语返回合作伙伴的名字。
4、环境信息:
假设你正在为一个有多个公司的 ERP 系统编写代码,你可能需要在每个请求中设置用户的公司。这样,你就可以确保每个用户只能看到他们自己公司的信息。
# 使用 context 设置 'allowed_company_ids' 参数 self.env['res.partner'].with_context(allowed_company_ids=[1, 2]).name_get()
在这个例子中,name_get
方法只会返回公司 1 和 2 的合作伙伴的名字。
所能用到的场景:
-
当你需要传递一些额外的参数给方法,但是你不想修改这个方法的签名的时候,可以使用 context。
-
当你需要设置一些全局的环境信息,比如当前用户的语言、时区等的时候,可以使用 context。
-
当你需要设置新记录的缺省值的时候,可以使用 context。
总结:
在 Odoo 中,context 是一个非常强大的工具。它不仅可以用来传递参数,设置缺省值,还可以用来保存环境信息。然而,context 也是一个双刃剑,如果使用不当,可能会引入一些难以预见的问题。因此,在使用 context 的时候,需要非常小心,并且始终记住,只有当你无法通过其他方式实现你的需求的时候,才应该使用 context。