Что мне нужно
Если пользователь нажимает на мою кнопку, переводит его на разные виды разных моделей в зависимости от поля текущей записи.
Что я сделал
Я объявил кнопку типа object для вызова метода Python.Внутри я проверяю поле.Если его значение равно A , я перенаправлю его на модель X , а если его значение равно B, я перенаправлю его на модель Y .
код
@api.multi
def my_button_method(self):
self.ensure_one()
if self.my_field == 'A':
action_id = self.env.ref(
'my_module.my_ir_actions_act_window_A')
return action_id.__dict__
elif self.my_field == 'B':
action_id = self.env.ref(
'my_module.my_ir_actions_act_window_B')
else:
action_id = False
if action_id:
return action_id.__dict__
Если я напишу это после определения action_id
:
_logger.info(action_id.name)
_logger.info(action_id.type)
_logger.info(action_id.res_model)
_logger.info(action_id.view_type)
_logger.info(action_id.view_mode)
_logger.info(action_id.search_view_id)
_logger.info(action_id.help)
, я получу правильные значения.Итак, после поиска в Google я увидел, что __dict__
дает вам словарь, ключи которого являются атрибутами объекта, а значения которого значения этих атрибутов.
Но код выдает ошибку, потому что action_id.__dict__
не делаетt вернуть словарь с ожидаемыми атрибутами действия и его значениями, но вместо этого:
{
'_prefetch': defaultdict(
<type 'set'>,
{
'ir.actions.act_window': set([449])
}
),
'env': <odoo.api.Environment object at 0x7f0aa7ed7cd0>,
'_ids': (449,)
}
Может кто-нибудь сказать мне, почему?Я пытаюсь избежать этого кода:
@api.multi
def my_button_method(self):
self.ensure_one()
if self.my_field == 'A':
action_id = self.env.ref(
'my_module.my_ir_actions_act_window_A')
elif self.my_field == 'B':
action_id = self.env.ref(
'my_module.my_ir_actions_act_window_B')
else:
action_id
if action_id:
return {
'name': action_id.name,
'type': action_id.type,
'res_model': action_id.res_model,
'view_type': action_id.view_type,
'view_mode': action_id.view_mode,
'search_view_id': action_id.search_view_id,
'help': action_id.help,
}
Может быть, есть гораздо лучшее решение с использованием действия сервера, если так, кто-нибудь знает, как?