如何阻止 Odoo 自定义按钮自动保存?

How can I stop Odoo custom button from auto save?

我在我的视图中创建了一个按钮,它触发了模块中的一个方法。但是,在单击按钮时,临时编辑的字段将被保存,并且在单击 'Discard' 按钮时不会恢复。

这是我的视图代码:

<form>
  <sheet>
    <group>
    <field name="name" />
    </group>
    <button name="my_button" string="My Button" type="object" class="oe_edit_only" />
  </sheet>
</form>

单击 my_button 后,字段 name 将保存在数据库中,按钮 Discard 将不再起作用。

如何防止 Odoo 在单击我的自定义按钮时保存临时数据?

(我正在使用 Odoo10,但我想它与旧版本的 Odoo 一样)

默认情况下,在 odoo 中,一旦您触发任何事件(例如按钮单击),任何服务器端代码都会呈现,然后无论如何都会首先保存记录,您将在 Self(调用对象)。

所以一旦你点击那个按钮,就意味着记录已经保存在数据库中,之后 Discard 将没有任何效果。

您可以在 Sales Quotation / Order 中看到的最佳示例有一个 link“Update”,它将 return True 来自方法它不执行任何操作,但一旦调用该方法,整个记录将被保存和总计(所有功能字段将被计算)并且你觉得 update link 执行计算(link 在仅限编辑模式)。

通常在新的 api 方法中,通过单击按钮调用的方法应该有装饰器 @api.one@api.multi

##Single record will be there in self.
@api.one
def button_click(self):
    return False

##list of records (recordset) will be there in self.
@api.multi
def button_click(self):
    return False

所以当你点击那个按钮时,会先保存记录,然后调用方法。

您可以将按钮更改为布尔字段,并使 my_button 方法成为 onchange

Python

my_button = fields.Boolean('Label')

@api.multi
@api.onchange('my_button')
def onchange_my_button(self):
    for record in self:
        # whatever my_button does

如果您希望它仍然显示为按钮,您可以显示样式为按钮的标签并隐藏实际的复选框。

XML

<label for="my_button" class="btn btn-sm btn-primary"/>
<field name="my_button" invisible="1"/>