Есть как минимум две возможности:
Создать несколько кнопок и показать или скрыть их по условию
В конце это должно выглядеть так:
<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
Вы также можете читать из уже существующих оконных действий (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