9.4.将参数传递给表单和动作——上下文
在内部,Odoo中的每个方法都可以访问一个称为上下文的字典,它从每个动作传播到交付该动作所涉及的方法。UI还可以访问它,并且可以通过在上下文中设置值以各种方式对它进行修改。在本章中,我们将通过使用语言、默认值和隐式过滤器来探索这种机制的一些应用。
9.4.1.准备工作
虽然不是严格必要的,但如果你安装了法语语言,这个小节会更有趣,如果你还没有得到这个。请参阅《第11章国际化》,了解如何做到这一点。如果你有一个法语数据库,将fr_FR改为其他语言;en_US可以代替英语。此外,单击一个客户的活动按钮(当鼠标悬停在它上时更改为存档),以便存档,并验证该合作伙伴不再显示在列表中。
9.4.2.如何实现
1). 创建一个新动作,非常类似于添加菜单项和窗口动作小节中的动作:
<act_window id="action_all_customers_fr"
name="Tous les clients"
res_model="res.partner"
domain="[('customer_rank', '<', 1)]"
context="{'lang': 'fr_FR', 'default_lang': 'fr_FR',
'active_test': False, 'default_customer_rank': 1}" />
2). 添加一个调用此动作的菜单。这将留给读者作为练习。
当您打开这个菜单时,视图将以法语显示,如果您创建了一个新的合作伙伴,它们将以法语作为其预选语言。一个不太明显的区别是,您还将看到停用(存档)的合作伙伴记录。
9.4.3.工作原理
上下文字典由几个源填充。首先,从当前用户的记录中读取一些值(lang和tz,代表用户的语言和时区)。然后,我们有一些附加组件,它们根据自己的目的添加键。此外,UI添加了关于当前我们正在处理哪个模型和哪个记录的键(active_id, active_ids, active_model)。同样,正如在打开特定视图的动作中所看到的,我们可以在动作中添加我们自己的键。它们被合并在一起,并传递给底层服务器函数和客户端UI。
因此,通过设置lang上下文键,我们将强制显示语言为法语。您将注意到,这不会改变整个UI语言,这是因为我们打开的列表视图位于此上下文中的范围内。UI的其余部分已经通过包含用户原始语言的另一个上下文加载了。但是,如果在这个列表视图中打开一条记录,它也会以法语显示,如果在表单上打开一条链接的记录或按下执行动作的按钮,语言也会传播。
通过设置default_lang,我们为在此上下文范围内创建的每个记录设置一个默认值。一般模式是default_$fieldname: my_default_value,在本例中,它允许您为新创建的合作伙伴设置默认值。假定我们的菜单是关于客户的,我们已经添加了default_customer_rank: 1作为默认情况下客户等级字段的值。但是,这是res.partner的模型范围内的默认值,所以这不会改变任何东西。对于标量字段,其语法与你在Python代码中编写的一样:字符串字段加引号,数字字段保持原样,布尔字段为真或假。对于关系字段,语法稍微复杂一些;请参阅《第6章,管理模块数据》,了解如何编写它们。
注意:
上下文中设置的默认值会覆盖模型定义中设置的默认值,因此您可以在不同的情况下使用不同的默认值。
最后一个键是active_test,它具有非常特殊的语义。对于每个具有active字段的模型,Odoo会自动过滤掉该字段为False的记录。这就是您取消选中该字段的合作伙伴从列表中消失的原因。通过设置这个键,我们可以抑制这个行为。
这对于UI本身是很有用的,但在您的Python代码中,当您需要确保一个动作应用于所有记录,而不仅仅是活动的记录时,它就更有用了。