上下文(context)在odoo14中的作用以及功能。并举例说明 。最后再总结一下。所能用到的场景。并归纳总结

在 Odoo 中,上下文(context)是一个非常重要的概念。Context 是一个 Python 字典,它在各种方法之间传递,并且可以影响这些方法的行为。

Context 的主要作用和功能:

  1. 传递参数:在执行方法的过程中,可以通过 context 传递参数。这些参数可以影响方法的行为。

  2. 本地化:context 中有一些特殊的关键字,可以用来设置当前用户的语言、时区等信息,从而实现本地化。

  3. 缺省值:context 中的 'default_' 关键字可以用来设置创建新记录时的缺省值。

  4. 环境信息: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。

 

posted @ 2023-07-19 16:27  *感悟人生*  阅读(408)  评论(0编辑  收藏  举报