Можно ли динамически изменять действие кнопки в зависимости от значения другого поля? Пример кода:
<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>
Действие этой кнопки будет действием1 или действием2 в зависимости от, скажем, значения логического / выбора / любого поля. Как этого добиться?





Есть как минимум две возможности:
Создание нескольких кнопок и отображение или скрытие их по условию
В итоге должно получиться так:
<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
В первом возможном решении были некоторые ошибки, сейчас я их исправил.
Идеальный ответ Нечего добавить
Первый способ не сработал, кнопки дублировали себя с конфигурацией последнего, не знаю почему. Но твой второй метод у меня сработал. В функции модели просто верните self.env ['ir.actions.act_window']. for_xml_id ('my_module', 'my_action') в зависимости от значения другого поля. Я не знал этой функции. Спасибо за помощь!