如何在Odoo 10中从Python返回现有的ir.actions.act_window?

时间:2018-05-24 13:28:01

标签: python xml odoo odoo-10

我需要什么

如果用户点击我的按钮,请根据当前记录的字段将他带到不同模型的不同视图。

我做了什么

我已经声明了一个类型 object 按钮来调用Python方法。在里面,我检查了字段。如果其值为 A ,我会将其重定向到模型 X ,如果其值为B,我会将其重定向到模型 Y 。< / p>

代码

@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)

我得到了正确的价值观。因此,在谷歌搜索之后,我看到__dict__为您提供了一个字典,其中键是对象的属性,其值是这些属性的值。

但代码发出错误是因为action_id.__dict__没有返回带有操作及其值的预期属性的字典,而是返回以下内容:

{
    '_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,
        }

使用服务器操作可能有更好的解决方案,如果有,有人知道怎么做?

1 个答案:

答案 0 :(得分:1)

你可以做很短的&#34;风格&#34;:

action = self.env.ref('my_module.my_ir_actions_act_window_A').read()[0]
return action

你会发现很多这样的例子&#34; style&#34;在Odoo代码。