“修改模型的方法”的版本间的差异
(→小窍门) |
(→小窍门) |
||
第40行: | 第40行: | ||
# class TodoTask(models.Model): | # class TodoTask(models.Model): | ||
# ... | # ... | ||
− | @api. | + | @api.one |
− | def do_toggle_done(self): | + | def do_toggle_done(self): |
− | + | if self.user_id != self.env.user: | |
− | + | raise Exception('Only the responsible can do this!') | |
− | + | else: | |
− | + | ||
return super(TodoTask, self).do_toggle_done() | return super(TodoTask, self).do_toggle_done() | ||
− | |||
− | |||
这些是重写和扩展模型类中定义的业务逻辑的基本技术。接下来,我们将了解如何扩展用户界面视图。 | 这些是重写和扩展模型类中定义的业务逻辑的基本技术。接下来,我们将了解如何扩展用户界面视图。 | ||
上一节:[[修改现有字段]] | 上一节:[[修改现有字段]] | ||
下一节:[[扩展视图]] | 下一节:[[扩展视图]] |
2018年3月3日 (六) 03:00的最新版本
继承也在业务逻辑级别起作用。添加新方法很简单:只需在继承类中声明新的函数。
要扩展或更改现有逻辑,可以通过声明具有完全相同名称的方法来覆盖相应的方法。新方法将替换前一个方法,它也可以只是扩展继承类的代码,使用Python的super()方法来调用父方法。然后,可以在调用super()方法之前和之后,在原有逻辑周围添加新逻辑。
小窍门
最好避免改变方法的函数签名(也就是说,保留相同的参数),以确保与其关联的现有调用继续正常工作。如果您需要添加其他参数,请将它们作为可选的关键字参数(使用默认值,这样做的目的是为了在调用函数的时候,即使不给这些带默认值的参数传值,函数也可以自己填入默认值,从而不去改变函数的签名)。
继续,原来Clear All Done按钮完成的操作不再适合我们的任务共享(task-sharing)模块,因为它不区分用户的清除所有任务,我们准备修改它,以便它只清除当前的用户的任务。为了达到目的,我们重写Clear All Done按钮对应的函数即do_clear_done(),修改为以下逻辑,首先找到当前用户对应的所有用户列表,然后对所有任务进行去使能操作(停止任务的活动)。代码如下:
@api.multi def do_clear_done(self): domain = [('is_done', '=', True), '|', ('user_id', '=', self.env.uid), ('user_id', '=', False)] dones = self.search(domain) dones.write({'active': False}) return True
为了清楚起见,我们首先构建要用于查找要清除记录的过滤器表达式。
这个过滤器表达式遵循称为domain的Odoo特定语法:它由条件组成的列表表示,其中每个条件是元组。
这些条件默认是用逻辑与(And)连接起来的,即条件需要同时成立,如果不是默认逻辑连接符号比如“|”符号(逻辑或),则运算操作符会影响到其后面的两个操作数(即采用波兰表达式)我们将在第6章-视图 - 用户界面设计这一章讨论更多关于域的细节。
此处域使用过滤将所有已完成的任务设置为('is_done','=',True),将仍有当前用户的情况设置为('user_id','=',self.env.uid),或将没有当前用户的情况设置为('user_id','=',False)。
然后,我们使用search方法获取一个具有完成记录的记录集,并对其进行批量写入,将active字段设置为False。这里的Python False值表示数据库中的NULL值。
在这种情况下,我们完全重写了父方法,将其替换为一个新的实现方法,但这不是我们通常想要做的。相反,我们应该扩展现有的逻辑与一些额外的操作。否则,我们可能会破坏已经存在的功能。
为了使重写的方法保持已经存在的逻辑,我们使用Python的super()语句来调用父方法的版本。让我们看一个例子。
我们可以改进do_toggle_done()方法,以便它只对分配给当前用户的任务执行其操作。这是实现的代码:
from odoo.exceptions import ValidationError # ... # class TodoTask(models.Model): # ... @api.one def do_toggle_done(self): if self.user_id != self.env.user: raise Exception('Only the responsible can do this!') else: return super(TodoTask, self).do_toggle_done()
这些是重写和扩展模型类中定义的业务逻辑的基本技术。接下来,我们将了解如何扩展用户界面视图。
上一节:修改现有字段 下一节:扩展视图