第 9 章:准备好采取行动了吗?¶
到目前为止,我们主要通过声明字段和视图来构建我们的模块。借助计算字段和 onchanges,我们刚刚在 previous chapter 中引入了业务逻辑。在任何实际的业务场景中,我们都希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中,我们希望能够:
取消或将房产设置为已售
接受或拒绝要约
有人可能会说,我们已经可以通过手动更改状态来完成这些事情,但这并不是很方便。此外,我们想要添加一些额外的处理:当报价被接受时,我们想要设置房产的售价和买家。
对象类型¶
参考:与此主题相关的文档可以在 行动 和 错误管理 中找到。
注解
目标:在本节末尾:
您应该能够取消或将房产设置为已售:
已取消的财产不能出售,已出售的财产也不能取消。为了清楚起见,已在视图上添加了“state”字段。
您应该能够接受或拒绝要约:
一旦报价被接受,应设定售价和买家:
在我们的房地产模块中,我们希望将业务逻辑与一些按钮链接起来。最常见的方法是:
在视图中添加一个按钮,例如在视图的``header``中:
<form>
<header>
<button name="action_do_something" type="object" string="Do Something"/>
</header>
<sheet>
<field name="name"/>
</sheet>
</form>
并将此按钮链接到业务逻辑:
from odoo import fields, models
class TestAction(models.Model):
_name = "test.action"
name = fields.Char()
def action_do_something(self):
for record in self:
record.name = "Something"
return True
通过在给定模型上分配“type="object"` to our button, the Odoo framework will execute a Python method with ``name=”action_do_something”`”。
要注意的第一个重要细节是我们的方法名称没有以下划线前缀(_)。这使得我们的方法成为**公共**方法,可以直接从 Odoo 接口调用(通过 RPC 调用)。到目前为止,我们创建的所有方法(compute、onchange)都是在内部调用的,因此我们使用带有下划线前缀的 private 方法。您应该始终将方法定义为私有方法,除非需要从用户界面调用它们。
另请注意,我们在“self”上循环。始终假设一个方法可以在多个记录上调用;它更有利于可重用性。
最后,公共方法应该始终返回一些内容,以便可以通过 XML-RPC 调用它。如有疑问,只需“return True”。
Odoo 源代码中有数百个示例。一个例子是 button in a view 及其 corresponding Python method
Exercise
取消并将房产设置为已出售。
将“取消”和“已售出”按钮添加到“
estate.property”模型中。已取消的房产不能设置为已出售,已出售的房产也不能取消。请参阅**目标**的第一张图片以了解预期结果。
提示:为了引发错误,您可以使用 UserError 函数。 Odoo 源代码中有很多示例;-)
将按钮“接受”和“拒绝”添加到“
estate.property.offer”模型中。有关预期结果,请参阅**目标**的第二张图片。
提示:要将图标用作按钮,请查看`at this example <https://github.com/odoo/odoo/blob/cd9af815ba591935cda367d33a1d090f248dd18d/addons/event/views/event_views.xml#L521>`__。
当报价被接受后,设置买家和相应房产的售价。
有关预期结果,请参阅**目标**的第三张图片。
请注意:在现实生活中,某一特定房产只能接受一个报价!
动作类型¶
在 第 5 章:最后,一些可以使用的 UI 中,我们创建了一个链接到菜单的操作。您可能想知道是否可以将操作链接到按钮。好消息,确实如此!一种方法是:
<button type="action" name="%(test.test_model_action)d" string="My Action"/>
我们使用``type=”action”`` and we refer to the external identifier in the name。
在 next chapter 中,我们将了解如何防止在 Odoo 中编码不正确的数据。