Изменить действие кнопки динамически - PullRequest
0 голосов
/ 15 января 2019

Можно ли динамически изменять действие кнопки в зависимости от значения другого поля? Пример кода:

<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 в зависимости, скажем, от логического / select / любого значения поля. Как этого достичь?

1 Ответ

0 голосов
/ 15 января 2019

Есть как минимум две возможности:

Создать несколько кнопок и показать или скрыть их по условию

В конце это должно выглядеть так:

<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...