动态改变按钮的动作
Change button's action dynamically
能否根据另一个字段的值动态更改按钮的操作?示例代码:
<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>
该按钮的操作将是 action1 或 action2,这取决于 boolean/select/whatever 字段的值。如何实现?
至少有两种可能:
创建多个按钮并按条件显示或隐藏它们
最后应该是这样的:
<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')]}" />
这显然不是完美的解决方案,但应该可行。
使用 python 方法返回一个动作
这也行,但会更动态一些。制作object
类型的按钮,在name
属性中设置一个模型多记录方式即可。
<button action="button_dynamic_action" string="Action" type="object" />
现在在视图模型上实现该方法:
@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
您还可以从代码中已经存在的 window 操作 (ir.actions.act_window) 中读取而不是 "creating" 它们,以下示例来自 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
能否根据另一个字段的值动态更改按钮的操作?示例代码:
<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>
该按钮的操作将是 action1 或 action2,这取决于 boolean/select/whatever 字段的值。如何实现?
至少有两种可能:
创建多个按钮并按条件显示或隐藏它们
最后应该是这样的:
<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')]}" />
这显然不是完美的解决方案,但应该可行。
使用 python 方法返回一个动作
这也行,但会更动态一些。制作object
类型的按钮,在name
属性中设置一个模型多记录方式即可。
<button action="button_dynamic_action" string="Action" type="object" />
现在在视图模型上实现该方法:
@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
您还可以从代码中已经存在的 window 操作 (ir.actions.act_window) 中读取而不是 "creating" 它们,以下示例来自 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