4.继承和Domain
True

4.1. 继承

模型继承

Odoo提供两种继承机制,以模块化方式扩展现有模型。
第一种继承机制允许一个模块修改另一个模块中定义的模型的行为。

  • 给模型添加字段
  • 覆盖模型现有字段
  • 给模型添加约束
  • 给模型添加方法
  • 覆盖模型现有方法

第二种继承机制(委托)允许将模型的每条记录链接到父模型的记录,并且提供对父记录的透明访问。

视图继承

Odoo不是通过覆盖来修改现有视图,而是通过视图继承。子视图不仅能够修改继承至父视图的自身内容,而且能够修改和删除父视图中的内容。
扩展视图使用inherit_id字段引用其父代,而不是单个视图,其arch字段由任意数量的xpath元素组成,选择和更改其父视图的内容:


已复制

expr

    在父视图中选择单个元素的XPath表达式。如果没有匹配到元素或者匹配到多个元素则引发错误。
position
    对匹配到的元素进行操作。
inside
    在匹配元素的末尾追加
before
    作为匹配元素的同级元素添加在其后面
after
    作为匹配元素的同级元素添加在其前面
replace
    替换匹配的元素
attributes
    使用新的属性替换匹配元素的属性

提示
当匹配单个元素时,position可以直接在匹配的元素上设置属性。下面的两个继承将给出相同的结果:


已复制

练习

 #更改现有内容
  • 使用模型继承,修改现有partner模型,添加instructor布尔字段,以及对应表示"授课-讲师"关联的many2many字段
  • 使用视图继承在partner的表单视图中显示这个字段

注意,这里是通过开发人员模式来查找视图外部ID并放置新字段的。

  • 创建文件openacademy/models/partner.py并将其导入__init__.py
  • 创建文件openacademy/views/partner.xml并将其添加到__manifest__.py

openacademy/__init__.py


已复制
openacademy/__manifest__.py

已复制

openacademy/partner.py
已复制
openacademy/views/partner.xml

已复制

4.2. Domain

Odoo中,Domain代表记录集的条件表达式。Domain是定义模型子集的一组规则。每个规则是一个包含名称、操作和值的三元组。例如,下面是Product模型子集的Domain表达式,“单价大于1000且类型为服务”的记录集:


已复制
多个规则组合时,默认条件组合方式是AND。逻辑运算符&(AND),|(OR),!(NOT)可以用来显示的组合多个规则。它们在前缀位置使用(操作符在参数之前,而不是中间)。例如下面的Domain表达式,含义是"类型为服务或者单价不介于1000和2000之间"
已复制
当在客户端界面选择记录集时,domain参数可以添加到关联字段上,以限制只显示有效的关联字段。

练习

  #在关联字段上使用Domain
  当为授课选取讲师时,只有instructor值为True的讲师会被显示出来。

openacademy/models.py


已复制
注意

声明为文字列表的domain会在服务端进行计算,不会出现在右侧的动态列表中,而声明为字符串的domain是在客户端进行计算的,字段名将出现在右侧列表。

练习更复杂的domain,创建新的partner类别Techer/Level1Techer/Level2.一个授课的教授人可以是讲师或者任意级别的教师。

  • 修改Session模型的domain
  • 修改openacademy/view/partner.xml以获得访问Partner类别的入口。

openacademy/models.py


已复制
openacademy/views/partner.xml
已复制

8.向导与国际化
True