动态更改按钮的动作

Dei*_*oks 3 xml xpath odoo odoo-view odoo-11

是否可以根据另一个字段的值动态更改按钮的动作?示例代码:

<xpath expr="//button[@class='oe_stat_button o_res_partner_tip_opp']" position="attributes">
    <attribute name="name">%(action1)d</attribute>
    <attribute name="name">%(action2)d</attribute>
</xpath>
Run Code Online (Sandbox Code Playgroud)

该按钮的动作可以是action1或action2,具体取决于布尔值/ select /任何字段的值。如何做到这一点?

CZo*_*ner 5

至少有两种可能性:

创建多个按钮并按条件显示或隐藏它们

最后应该看起来像:

<field name="my_selection_field" />
<button name="%(action1)d" string="Action 1" attrs="{'invisible': [('my_selection_field', '!=', 'selection1')]}" />
<button name="%(action2)d" string="Action 2" attrs="{'invisible': [('my_selection_field', '!=', 'selection2')]}" />
<button name="%(action3)d" string="Action 3" attrs="{'invisible': [('my_selection_field', '!=', 'selection3')]}" />
Run Code Online (Sandbox Code Playgroud)

这显然不是完美的解决方案,但它应该可以工作。

使用python方法返回操作

这也将起作用,但会更加动态。只需键入类型的按钮,object然后在name属性中设置模型多记录方法即可。

<button action="button_dynamic_action" string="Action" type="object" />
Run Code Online (Sandbox Code Playgroud)

现在在视图模型上实现该方法:

@api.multi
def button_dynamic_action(self):
    self.ensure_one()
    action = {}
    if self.my_selection_field == 'selection1':
        action = {
            'name': _('Action 1'),
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'my.model',
            #'view_id': # optional
            'type': 'ir.actions.act_window',
            #'res_id': # optional
            'target': 'new' # or 'current'
        }
    elif self.my_selection_field == 'selection2':
        action = {
            'name': _('Action 2'),
            'view_type': 'form',
            'view_mode': 'tree',
            'res_model': 'my.model',
            #'view_id': # optional
            'type': 'ir.actions.act_window',
            #'res_id': # optional
            'target': 'current' # or 'new'
        }
    # and so on
    return action
Run Code Online (Sandbox Code Playgroud)

您还可以从现有的窗口动作(ir.actions.act_window)中读取内容,而不用在代码中“创建”它们,以下示例来自Odoo本身:

res = self.env['ir.actions.act_window'].for_xml_id('base', 'action_attachment')
# ... change res with context or name and so on
return res
Run Code Online (Sandbox Code Playgroud)