odoo如何在原模块上进行扩展或者继承重写新模块以及对视图继承

Odoo提供三种模型扩展方式:原型继承、扩展继承和委托继承。原型继承创建新模型并添加新信息,扩展继承则替代并扩展已有模型。视图继承允许重写现有视图,通过xpath定位和修改元素。此文章详细介绍了这三种继承机制及其在实际应用中的用法。
摘要由CSDN通过智能技术生成

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语法教程​​​​​​​ 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值