摘要:在这一篇教程中,将会涉及到外键字段,可以将两个模型关联起来,然后很方便地获取到对应的数据。关联字段这一小节里,我们会给待办事项加上分类,并且这个分类可以让用户自己创建维护。今天这篇教程的内容就先到这里了,教程中的代码会更新在我的仓库中。
在这一篇教程中,将会涉及到外键字段,可以将两个模型关联起来,然后很方便地获取到对应的数据。
关联字段这一小节里,我们会给待办事项加上分类,并且这个分类可以让用户自己创建维护。我们需要先创建一个新的模型 TodoCategory,然后将它和待办事项关联起来:
# models.py class TodoCategory(models.Model): _name = "todo.category" _description = "分类" name = fields.Char(u"名称") task_ids = fields.One2many("todo.task", "category_id", string=u"待办事项") count = fields.Integer(u"任务数量", compute="_compute_task_count") @api.depends("task_ids") @api.multi def _compute_task_count(self): pass class TodoTask(models.Model): _name = "todo.task" _description = "待办事项" # ... category_id = fields.Many2one("todo.category", string=u"分类")
在上面的代码中,我们定义了一个 todo.category 模型,包含三个字段,然后添加了一个 category_id 到待办事项模型中,我们重点来看看 category_id 和 task_ids 这两个字段。
这两个字段都是关联字段,一个是 Many2one,另一个是 One2many,还有一种我们暂时不会讲到的 Many2many 多对多的关联字段。Many2one 有一个必填的属性 comodel_name 表示要关联的模型的 _name,这个字段的值可能是 0 个或 1 个所关联对象的记录集,我们可以通过这个字段直接获取到所关联的数据对象,而不需要自己去查找对应的实例。另一个关联字段 One2many 同样有必填的属性 comodel_name,同时还有一个 inverse_name 属性,表示的是与当前模型所关联的模型(comodel_name 所指的模型)的 Many2one 字段的字段名,在此例中即 category_id,通过 One2many 字段我们可以直接获取到所有关联了当前记录的数据集。在这个例子中,假设我们有一个分类是「工作」,也就是说我们可以通过工作这个分类的 task_ids 这个字段获取到所有待办事项中 category_id 所关联的分类是「工作」的所有待办事项。
回到我们的代码中,我们看到分类模型中还有一个计算字段 count,我们希望可以看到在一个分类下有多少待办事项,所以需要用到上一篇教程中所讲到的计算字段,这里就当作是复习,一起来完成这个字段的计算逻辑:
# models.py @api.depends("task_ids") @api.multi def _compute_task_count(self): for record in self: record.count = len(record.task_ids)
这里的逻辑也十分简单,我们只需要通过记录集的实例对象 record 获取到对应的待办事项,然后用 len() 获取 task_ids 的长度即可。
好的,模型已经有了,还差了点什么呢?没错,还少了菜单和视图,这里我们直接给出代码,如果还有不理解怎么创建菜单和视图的小伙伴,记得翻看一下之前的教程内容。
待办事项 todo.task form tree,form current 分类 todo.category form tree,form current
菜单这里我们多增加了一层,聪明的你们应该能够一眼看出来哪里不同了,如果还是没找到,实际运行之后再观察一下菜单的结构吧~
todo.category.view_tree todo.category tree
OK,来更新一下模块,然后打开看看效果吧,再尝试创建几个分类,并且给待办事项关联上分类。
视图一切看起来还不错,但是有没有觉得,创建待办事项的表单视图(Form View),以及分类的表单视图,显得有些凌乱了?虽然并不是不能用,但是,我们还是决定要改造一下!
我们先从分类的视图开始,首先可以看到分类中主要的信息就两个——分类的名称和分类下的任务数量。待办事项我们其实不需要从分类中直接去查看,所以我们大可不必把待办事项的记录显示出来,那我们的目标已经很明确了,隐藏分类表单视图中的待办事项记录,和 Tree View 一样,我们把视图先写好:
todo.category.view_form todo.category form
怎么样,看起来是不是舒服多了~再仔细一想,创建分类其实也只需要填一个名称,能不能不需要跳转到专门的表单视图里去创建咧?那当然是没问题的啦,我们可以让分类直接就在 Tree View 中创建而不需要专门到 Form View 中去:
todo.category.view_tree todo.category tree
其实很简单,我们只需要在分类的 Tree View 中的
待办事项的表单视图,我们只需要简单地排一下版就好啦,没有复杂的处理:
todo.task.view_form todo.task form
视图部分,就先到这里,这还只是很基础的一小部分内容,后面还会有更多关于视图部分的特性,在我们用到的时候将会给大家讲解。
今天这篇教程的内容就先到这里了,教程中的代码会更新在我的 GitHub 仓库中。
仓库地址:Odoo-Tutorial-Demo
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42268.html
摘要:虽然这是个很简单的应用,但是希望大家可以动手一起操作,从最简单的开始上手学习如何使用这个框架。则是在和之间,负责响应用户操作,从中获取数据进行处理并返回到中。 showImg(https://segmentfault.com/img/bV66tE?w=728&h=410); 在第一篇教程发布之后差不多一个月的今天,终于完成了第二篇内容,这个发布周期拖得实在是有点太长了,我都觉得不好意思...
摘要:今天这个系列教程即将迎来它的最后一篇内容了,我们将要来学习中权限相关的内容。在的权限管理体系中,同样也有用户组这一概念的存在,和其他框架如可以说大同小异。通常和权限相关的内容,我们都会在模块的目录下进行定义,记录集规则的定义自然也不例外。 在今年的情人节(2018.02.14)那天,我写了一篇博客说即将要开一个坑,也就是大家在看的这个系列的教程。今天这个系列教程即将迎来它的最后一篇内容...
摘要:现在我们来给待办事项增加一个紧急程度的字段,用来表示当前任务的优先级。此处我们还给这个字段添加了默认值,表示当一个待办事项被创建后,如果没有指定紧急程度,将默认是待办状态。这篇教程中的代码同样会更新在我的仓库中。 showImg(https://segmentfault.com/img/bVbfv3E?w=1330&h=912); 在这篇教程里我们将会了解到 Odoo 模型里的一些其他...
摘要:大家好鸭,我又来更新啦还记得我们在第二篇教程中提到过的动作吗,今天我们就来专门讲讲在中的,学习不同类型的动作对应的应用场景,并且在我们的应用中使用上其中一些类型的动作。报表动作这类型的动作用于触发报表打印,例如打印发票等。 showImg(https://segmentfault.com/img/bVbhdTE?w=1471&h=845); 大家好鸭,我又来更新啦!还记得我们在第二篇教...
摘要:在前面教程中,我们使用了两种类型的视图和今天我们将学习使用另一种类型的视图搜索视图。大家可以试试看同时应用多个分组,或者将分组和过滤器组合使用,仔细观察和思考产生的结果。还是老规矩,教程中的代码会更新在仓库中。 showImg(https://segmentfault.com/img/bVbgO85?w=1950&h=1300); 在前面教程中,我们使用了两种类型的视图——TreeVi...
阅读 1862·2021-11-23 09:51
阅读 1502·2021-11-19 09:40
阅读 3153·2021-11-11 11:01
阅读 1073·2021-09-27 13:34
阅读 1795·2021-09-22 15:56
阅读 2067·2019-08-30 15:52
阅读 1038·2019-08-30 14:13
阅读 3420·2019-08-30 14:10