返回

Odoo13实现form视图按钮定制开发的技巧

前端

前言

在Odoo13中,form视图的所有按钮按钮都会触发保存操作,而odoo默认的保存操作会触发验证,就是说odoo会先验证保存完表单,再去执行按钮对应的方法。但是在某些情况下,我们只是想单纯的实现按钮对应的功能,并不想触发保存操作和验证。例如,我们在form视图中有一个按钮,用于打开一个新的窗口,此时我们只需要执行按钮对应的打开窗口的方法,而不需要保存表单并触发验证。

实现方法

为了实现上述需求,我们可以使用odoo的几个内置方法来达到目的。

  • env.context.update()

    该方法用于更新当前上下文的键值对。我们可以使用该方法将ignore_save键的值设置为True,这样odoo就不会在执行按钮对应的操作之前保存表单并触发验证了。

  • res.model.browse(ids).write(vals)

    该方法用于更新模型的记录。我们可以使用该方法直接更新模型的记录,而不需要先保存表单并触发验证。

  • res.model.browse(ids).action_your_action()

    该方法用于执行模型的自定义操作。我们可以使用该方法直接执行按钮对应的自定义操作,而不需要先保存表单并触发验证。

具体步骤

  1. 在form视图中,找到要定制的按钮。

  2. 在按钮的on_click属性中,添加以下代码:

    on_click="context.update({'ignore_save': True})"
    
  3. 在按钮对应的控制器中,修改按钮对应的操作方法,直接使用res.model.browse(ids).write(vals)res.model.browse(ids).action_your_action()方法来更新模型的记录或执行自定义操作。

实例

以下是一个具体的例子,演示如何使用上述方法来定制form视图中的按钮。

需求:在一个form视图中,有一个按钮,用于打开一个新的窗口。

步骤:

  1. 在form视图中,找到要定制的按钮。

  2. 在按钮的on_click属性中,添加以下代码:

    on_click="context.update({'ignore_save': True})"
    
  3. 在按钮对应的控制器中,修改按钮对应的操作方法,直接使用res.model.browse(ids).write(vals)res.model.browse(ids).action_your_action()方法来更新模型的记录或执行自定义操作。

@api.multi
def action_open_window(self):
    # 更新模型的记录
    self.write({'state': 'done'})

    # 执行自定义操作
    return {
        'type': 'ir.actions.act_window',
        'name': 'New Window',
        'res_model': 'your.model',
        'views': [[False, 'form']],
        'target': 'new',
    }

总结

通过使用odoo内置的方法,我们可以轻松地定制form视图中的按钮,实现各种自定义操作。