Odoo提供三种不同以模块化方式扩展模型:
- 原型继承:从现有模型创建新模型,向副本添加新信息,但保留原始模模型(常用)
- 扩展继承:扩展其他模块中定义的模型,替换以前的版本(常用)
- 委托继承:将一些模型的字段委托给它包含的记录
原型继承(带_name继承,创建新的表)
当同时使用 _inherit 和 _name 属性时, Odoo使用现有的模型作为基础来创建一个新的模型。 这个新的模型从基础模型中获取所有的字段,方法和元信息(默认值和al)
class HrEmployeePublic(models.Model):
_name = "hr.employee.public"
_inherit = ["hr.employee.base"]
_description = 'Public Employee'
text = fields.Text(string='新字段') # 模块添加新的字段
扩展继承 (不创建新表,对现有模型的扩展)
当使用 _inherit 但是没有提供 _name 时, 新模型替代已存在的模型,本质是在原有模型进行扩展。对于添加新字段或方法是非常有用的,或者去定制或重新配置它们 (例如 改变它们的默认排序)
提示:扩展继承只对原模型的字段属性、方法、视图有效。通过定义同名方法或字段,可以对原模块进行重写覆盖。权限规则不能重写覆盖,只会新建一个同名的记录规则
class HrInherit(models.Model):
_inherit = ["hr.employee.public"]
text = fields.Text(string='新字段') # 在原模块添加新的字段
视图继承
在odoo里可以通过继承的方式来改写已经存在的view,对比view的定义视图定义中写法多了inherit_id。支持的视图类型:form、tree、search …
<field name="inherit_id" ref="模块名.继承视图id"/>
<record id="view_purchase_record_tree_inherit" model="ir.ui.view">
<field name="name">purchase_record</field>
<field name="model">purchase.record</field>
<!--继承重写view_purchase_record_tree视图 -->
<field name="inherit_id" ref="supplier_management.view_purchase_record_tree"/>
<field name="arch" type="xml">
在arch里用xpath定位改写的元素
通过xpath语法,可以对xml文件中要显示的内容,进行自定义的显示,比如:我们要插入一个新的标签在当前已经存在的标签的后边,前边,里边甚至替换。。。
定位替换整个tree标签
<field name="arch" type="xml">
<xpath expr="//tree" position="replace">
<tree>
<field name="order_id"/>
<field name="product_code" optional="hide"/>
<field name="product_id" decoration-bf="1"/>
<field name="attribute" optional="show"/>
<field name="name"/>
<field name="category_id" optional="show"/>
<field name="date"/>
<field name="purchaser_id" widget="many2one_avatar_employee"/>
<field name="quantity"/>
<field name="price" widget="monetary"/>
<field name="rate"/>
<field name="subtotal" widget="monetary" sum="未税金额总计"/>
<field name="subtotal_tax" widget="monetary" sum="税额总计" optional="hide"/>
<field name="total" widget="monetary" sum="汇总"/>
<field name="currency_id" invisible="1" />
<field name="note" optional="hide"/>
</tree>
</xpath>
</field>
定位替换指定字段
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="replace">
<field name="order_id"/>
<field name="product_code" optional="hide"/>
<field name="product_id" decoration-bf="1"/>
</xpath>
</field>
-
注意找到的元素必须是一个,如果定位出多个元素或者是空,都会报错。
-
expr Xpath表达式用来选择父视图中的某个元素,如果没找到或找到多个元素会抛出一个异常
position定位有如下选择
-
inside 在内部结尾插入元素
-
replace 替换元素
-
before 在之前插入元素
-
after 在其后插入元素
-
attributes 修改xml的属性
完整易懂的XPath语法教程