• 【零散技术】10分钟学会odoo的原型继承


    序言:时间是我们最宝贵的财富,珍惜手上的每个时分

    本文章将以odoo中的仓库表(stock.warehouse)作为例子,为大家讲述odoo的【原型继承】

    目录

    1.添加Depends模块

    2.字段

            2.2增加字段

            2.1继承修改原字段

            3.方法

    3.1增加方法

    3.2继承方法

            3.2.1直接覆盖

            3.2.2继承覆盖

            4.修改视图


    1.添加Depends模块

            使用类继承即可对原始模型进行拓展,最常见的继承形态。继承方法前我们需要为新模块的__manifest__.py 添加 denepds 的模块。   否则将会出现找不到模型的报错。     

    1. # -*- coding: utf-8 -*-
    2. {
    3. ‘’‘
    4. 'depends': ['stock'],
    5. ’‘’
    6. }

    我是如何确定 需要 depsnds 【stock】模块呢?

    最原始的方法为:全局搜索关键字 “stock.warehouse”

            这个范围太广了!还是用高效一些的方法把:

            激活开发者模式,选择模型-》搜索stock.warehouse,查看字段: 应用程序

             该应用程序,即为模块的文件夹名称,在该范围内搜索,可以更加精确。

            小tips:odoo原生的模型命名都是有规律的,我们以模型 第一个 . 之前的字符为文件夹参照去寻找一般都能找到答案,例如,stock.location 、 account.move,他们定义的模块就分别是stock和account

    2.字段

    2.1增加字段

            现需要给仓库(stock.warehouse)增加 仓库类型字段,那么代码如下:

    通过 关键字 inherit 指定 继承的模型为:stock.warehouse(仓库模型),随后定义字段即可。

    1. class StockWarehouse(models.Model):
    2. _inherit = 'stock.warehouse'
    3. stock_type = fields.Char(string='仓库类型')

    2.2继承修改原字段

            增加字段后,现在又希望修改原始字段的属性,比如:希望将【缩写】改为【仓库代码】,

    那么直接复制原有的字段定义(Char),只传 string参数,即可完成覆盖。

    1. class StockWarehouse(models.Model):
    2. _inherit = 'stock.warehouse'
    3. code = fields.Char(string='仓库编码')

            当然这只是一个示例,更改 string还有其他方式:

                    1)视图继承修改

                    2)翻译修改

            在此就不细说。

    3.方法

    3.1增加方法

            假设现在还需要通过按钮方法控制仓库类型是【自营仓】还是【第三方仓】

    那么只需要正常新建方法即可。

    1. def change_stock_type(self,type):
    2. self.write({'stock_type':type})
    3. def change_stock_type_self(self):
    4. self.change_stock_type('自营仓')
    5. def change_stock_type_custom(self):
    6. self.change_stock_type('第三方仓')

    3.2继承方法

            3.2.1直接覆盖

                    此方法十分霸道,通过编写与原模块一样的方法名,完全覆盖原方法内容。

            如非特殊情况,否则不要使用。

                    特别是原生方法,可能会存在多次继承关系,强行覆盖会导致其他逻辑问题。

    1. #现方法,强行修改逻辑
    2. def change_stock_type_self(self):
    3. self.change_stock_type('自营仓')
    4. #新增逻辑
    5. self.do_something()

            3.2.2继承覆盖

                    常见方法,在保持原有方法的基础上,续写功能,可保证原有逻辑干净顺畅。

    1. def change_stock_type_self(self):
    2. #原逻辑
    3. super(StockWaarehouse, self).change_stock_type()
    4. #新逻辑
    5. self.do_something()

    4.修改视图

            4.1找到xml视图ID

     

            激活开发者模式后,在需要修改的视图上点击 【debug】小按钮,查看外部ID

        4.2编写xml文件

    1. <odoo>
    2. <record id="随便" model="ir.ui.view">
    3. <field name="name">随便field>
    4. <field name="model">stock.warehousefield>
    5. <field name="inherit_id" ref="stock.view_warehouse_tree"/>
    6. <field name="arch" type="xml">
    7. <xpath expr="//field[@name='lot_stock_id']" position="after">
    8. <field name="stock_type"/>
    9. xpath>
    10. <xpath expr="//sheet" position="inside">
    11. <header>
    12. <button name="change_stock_type_self" type="object" string="设为自营仓"/>
    13. <button name="change_stock_type_custom" type="object" string="设为第三方仓"/>
    14. header>
    15. xpath>
    16. field>
    17. record>
    18. odoo>

        4.3 引用xml文件

                   在__manifest__.py中 声明引用

    1. 'data': [
    2. 'views/stock_warehouse_views.xml'
    3. ],

    通过以上步骤,即可完成完整的仓库继承拓展

    odoo开发部署实施.

    wx号: _ro_cd

  • 相关阅读:
    Go编译DLL与SO
    葡聚糖修饰Fe3O4磁性纳米粒子,脂质体(CMD-LIPs)定制服务
    垃圾判断算法与4大引用
    ES6 let与const
    flac转换成mp3,flac转mp3方法
    【深度学习】手写数字识别
    PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!
    Cilium系列-15-7层网络CiliumNetworkPolicy简介
    工龄10年的测试员从大厂“裸辞”后...
    “工会排队”模式:重塑电商生态的新力量
  • 原文地址:https://blog.csdn.net/Srekal/article/details/126556184