我在视图中创建了一个按钮,该按钮触发模块内的方法。但是,单击该按钮后,临时编辑的字段将被保存,并且在单击“放弃”按钮时不会恢复。
这是我的观点的代码:
<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 也是如此)
您可以将按钮更改为布尔字段,并使您的
my_button
方法成为 onchange
。
my_button = fields.Boolean('Label')
@api.multi
@api.onchange('my_button')
def onchange_my_button(self):
for record in self:
# whatever my_button does
如果您希望它仍然显示为按钮,您可以显示样式为按钮的标签并隐藏实际的复选框。
<label for="my_button" class="btn btn-sm btn-primary"/>
<field name="my_button" invisible="1"/>
默认情况下,在odoo中,一旦触发任何事件(如按钮单击),任何服务器端代码都会呈现,然后记录将首先保存,并且您将在Self(调用对象)中获取记录。
所以一旦你点击该按钮,就意味着该记录已保存在数据库中,之后就不会再有Discard的效果了。
您可以在
Sales Quotation / Order
中看到的最好的例子有一个链接“Update”,它只会从不执行任何操作的方法返回True,但是一旦调用该方法,就会保存整个记录和总计(所有功能字段将被计算)并且您感觉更新链接执行计算(该链接仅在编辑模式下可见)。
通常在从按钮单击调用的新 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
因此,当您单击该按钮时,首先记录保存,然后将调用方法。
您可以创建一个由 CSS 隐藏的布尔字段,并将其与使用按钮类的标签相关联,然后当触发写入功能时,验证您的布尔字段是 true 还是 false 以执行您想要的更改。
XML:
<label for="boolean_field" class="btn btn-sm btn-primary"
attrs="{'invisible': [('boolean_field', '=', False)]}"/>
<div style="display:none;">
<field name="boolean_field"/>
</div>
Python:
def write(self, vals):
if vals['boolean_fields'] == True:
# Do something
return super().write(vals)