国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

odoo 開發(fā)入門教程系列-繼承(Inheritance)

這篇具有很好參考價(jià)值的文章主要介紹了odoo 開發(fā)入門教程系列-繼承(Inheritance)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

繼承(Inheritance)

Odoo的一個(gè)強(qiáng)大方面是它的模塊化。模塊專用于業(yè)務(wù)需求,但模塊也可以相互交互。這對于擴(kuò)展現(xiàn)有模塊的功能非常有用。例如,在我們的房地產(chǎn)場景中,我們希望在常規(guī)用戶視圖中直接顯示銷售人員的財(cái)產(chǎn)列表。

在介紹特定的Odoo模塊繼承之前,讓我們看看如何更改標(biāo)準(zhǔn)CRUD(創(chuàng)建、檢索,更新或刪除)方法的行為

Python繼承(Python Inheritance)

目標(biāo):

  • 不能刪除狀態(tài)不為New、Canceled的房產(chǎn)

    預(yù)期效果動畫地址:https://www.odoo.com/documentation/14.0/zh_CN/_images/unlink.gif

odoo 開發(fā)入門教程系列-繼承(Inheritance)

  • 房產(chǎn)收到報(bào)價(jià)時(shí),房產(chǎn)狀態(tài)應(yīng)該改成‘Offer Received’

  • 不能以低于現(xiàn)有報(bào)價(jià)的價(jià)格創(chuàng)建報(bào)價(jià)

    預(yù)期效果動畫地址:https://www.odoo.com/documentation/14.0/zh_CN/_images/create.gif

    odoo 開發(fā)入門教程系列-繼承(Inheritance)

在我們的房地產(chǎn)模塊中,我們從不需要開發(fā)任何特定的東西來執(zhí)行標(biāo)準(zhǔn)的CRUD操作。Odoo框架提供了實(shí)現(xiàn)這些操作的必要工具。事實(shí)上,多虧經(jīng)典的Python繼承,我們的模型中已經(jīng)包含了這樣的操作:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test.model"
    _description = "Test Model"

    ...

我們的 TestModel 類繼承與Model,該Model類提供了 create(), read(), write()unlink()方法。

這些方法(和其它在Model中定義的任何方法)可被擴(kuò)展以添加指定業(yè)務(wù)邏輯:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test.model"
    _description = "Test Model"

    ...

    @api.model
    def create(self, vals):
        # Do some business logic, modify vals...
        ...
        # Then call super to execute the parent method
        return super().create(vals)

model()裝飾器對于create() 方法來說是必需的,因?yàn)榻Y(jié)果集self的內(nèi)容和創(chuàng)建(creation)的上下文無關(guān),但該裝飾器對于其它CRUD方法來說不是必需的。

Python 3中, super() 等價(jià)于 super(TestModel, self)。當(dāng)你需要使用一條被修改后的結(jié)果集調(diào)用父方法時(shí),可能需要使用后者。

危險(xiǎn)提示

  • 總是調(diào)用 super()以避免中斷流非常重要。只有少數(shù)非常特殊的情況才無需調(diào)用它。
  • 總是返回和父方法一致的數(shù)據(jù)。例如父方法返回一個(gè)dict(),你重寫父方法時(shí)也要返回一個(gè)dict()

練習(xí)--添加業(yè)務(wù)邏輯到CRUD方法

  • 如果房產(chǎn)記錄狀態(tài)不是New,Canceled,則不讓刪除

提示:重寫unlink() ,并記住self可以是一個(gè)包含多條記錄的結(jié)果集。

  • 創(chuàng)建報(bào)價(jià)時(shí),設(shè)置房產(chǎn)狀態(tài)為‘Offer Received’,如果用戶試圖以低于已存在報(bào)價(jià)的金額創(chuàng)建報(bào)價(jià)時(shí)拋出錯(cuò)誤。

提示: 可在vals中獲取property_id 字段,但是它是一個(gè)int型。要實(shí)例化一個(gè)estate.property 對象,請使用self.env[model_name].browse(value) (示例)

    @api.model
    def create(self, vals):
        self.env['gamification.badge'].browse(vals['badge_id']).check_granting()
        return super(BadgeUser, self).create(vals)

修改odoo14\custom\estate\views\estate_property_views.xml 去掉estate_property_view_tree<tree>元素的editable="top"屬性(說明:為了方便執(zhí)行報(bào)價(jià)創(chuàng)建操作)

修改odoo14\custom\estate\models\estate_property.py

    @api.constrains('selling_price', 'expected_price')
    def _check_selling_price(self):
        # if record.selling_price < self.expected_price * 0.9:
        #     raise ValidationError("selling price can`t not lower then 90 percent of expected price")
        pass

說明:為了方便實(shí)踐操作,暫且不做售價(jià)校驗(yàn)

最末尾新增以下代碼

    def unlink(self):
        for record in self:
            if record.state not in ['New', 'Canceled']:
                raise UserError('can`t delete property which status is New or Canceled')
        return super().unlink()

修改odoo14\custom\estate\models\estate_property_offer.py,導(dǎo)入UserError

from odoo.exceptions import UserError

最末尾添加一下代碼

    @api.model
    def create(self, vals):
        property = self.env['estate.property'].browse(vals['property_id'])
        
        if vals.get('price') < property.best_price:
            raise  UserError('不能低于現(xiàn)有報(bào)價(jià)')
        property.state = 'Offer Received'
        return super().create(vals)

重啟服務(wù),刷新瀏覽器驗(yàn)證

刪除非NewCanceled狀態(tài)的房產(chǎn),提示如下:

odoo 開發(fā)入門教程系列-繼承(Inheritance)

odoo 開發(fā)入門教程系列-繼承(Inheritance)

odoo 開發(fā)入門教程系列-繼承(Inheritance)

模塊繼承(Model Inheritance)

引用: 查看主題相關(guān)文檔繼承和擴(kuò)展

我們希望在“Settings/Users & Companies/Users”表單視圖中直接顯示與銷售人員關(guān)聯(lián)的房產(chǎn)列表。為此,我們需要向res.users模型添加一個(gè)字段,并調(diào)整其視圖以顯示它。

Odoo提供了兩種繼承機(jī)制來以模塊化的方式擴(kuò)展現(xiàn)有模型。

第一繼承機(jī)制允許模塊通過以下方式修改在另一個(gè)模塊中定義的模型的行為:

  • 向模型添加字段

  • 覆蓋模型中字段的定義

  • 給模型添加約束

  • 給模型添加方法

  • 重寫模型中的現(xiàn)有方法

第二種繼承機(jī)制(委托)允許將模型的每個(gè)記錄鏈接到父模型的記錄,并提供對該父記錄的字段的透明訪問。

odoo 開發(fā)入門教程系列-繼承(Inheritance)

odoo中,第一種機(jī)制最常用。在我們的例子中,我們希望向現(xiàn)有模型添加一個(gè)字段,這意味著我們將使用第一種機(jī)制。例如:

from odoo import fields, models

class InheritedModel(models.Model):
    _inherit = "inherited.model"

    new_field = fields.Char(string="New Field")

這里可以找到將兩個(gè)字段添加到模型中的示例

class AccountMoveLine(models.Model):
    _inherit = 'account.move.line'

    vehicle_id = fields.Many2one('fleet.vehicle', string='Vehicle')
    need_vehicle = fields.Boolean(compute='_compute_need_vehicle',
        help="Technical field to decide whether the vehicle_id field is editable")

    def _compute_need_vehicle(self):
        self.need_vehicle = False

按照慣例,每個(gè)繼承的模型都在其自己的Python文件中定義。在我們的示例中為“models/inherited_model.py”。

練習(xí)--添加字段到用戶模型

  • 添加一下字段到res.users:
Field Type
property_ids One2many inverse of salesman_id to estate.property
  • 添加一個(gè)domain到該字段,這樣以便僅顯示可獲取房產(chǎn)。

新增odoo14\custom\estate\models\estate_res_user.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from odoo import models, fields

class EstateResUser(models.Model):
    _inherit = 'res.users'

    property_ids = fields.One2many('estate.property', 'salesman_id', domain="[('salesman_id', '=', active_id)]")

修改odoo14\custom\estate\models\__init__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from . import estate_property_type
from . import estate_property_tag
from . import estate_property_offer
from . import estate_property
from . import estate_res_user # 本次新增

視圖繼承(View Inheritance)

參考: 主題關(guān)聯(lián)文檔可查看Inheritance.

目標(biāo): 在用戶表單視圖中顯示與銷售人員關(guān)聯(lián)的avaliable房產(chǎn)列表其用戶表單視圖

odoo 開發(fā)入門教程系列-繼承(Inheritance)

Odoo提供了視圖繼承,其中子“擴(kuò)展”視圖應(yīng)用于根視圖之上,而不是就地修改現(xiàn)有視圖(通過重寫它們)。這些擴(kuò)展既可以添加內(nèi)容,也可以從父視圖中刪除內(nèi)容。

擴(kuò)展視圖使用inherit_id字段引用其父視圖。它的arch字段包含多個(gè)xpath元素,用于選擇和更改父視圖的內(nèi)容,而不是單個(gè)視圖:

<record id="inherited_model_view_form" model="ir.ui.view">
    <field name="name">inherited.model.form.inherit.test</field>
    <field name="model">inherited.model</field>
    <field name="inherit_id" ref="inherited.inherited_model_view_form"/>
    <field name="arch" type="xml">
        <!-- find field description and add the field
             new_field after it -->
        <xpath expr="http://field[@name='description']" position="after">
          <field name="new_field"/>
        </xpath>
    </field>
</record>
  • expr

    一個(gè)用于選擇父視圖中單個(gè)元素的XPath表達(dá)式。如果不匹配任何元素或者匹配多個(gè)元素,則拋出錯(cuò)誤

  • position

    應(yīng)用于匹配元素的操作:

    inside

    xpath的主體附加到匹配元素的末尾(個(gè)人理解,添加為匹配元素的子元素)

    replace

    將匹配元素替換為xpath的主體,將新主體中出現(xiàn)的任何$0節(jié)點(diǎn)替換為原始元素

    before

    在匹配元素之前插入xpath的主體作為同級元素

    after

    在匹配的元素之后插入xpaths的主體,作為同級元素

    attributes

    使用xpath主體中的特定屬性元素更改匹配元素的屬性

當(dāng)匹配單個(gè)元素時(shí),可以直接在要查找的元素上設(shè)置position屬性。以下兩種繼承都有相同的結(jié)果

<xpath expr="http://field[@name='description']" position="after">
    <field name="idea_ids" />
</xpath>

<field name="description" position="after">
    <field name="idea_ids" />
</field>

在這里可以找到視圖繼承擴(kuò)展的示例

<?xml version='1.0' encoding='utf-8'?>
<odoo>
    <record id="view_move_form" model="ir.ui.view">
        <field name="name">account.move.form</field>
        <field name="model">account.move</field>
        <field name="inherit_id" ref="account.view_move_form"/>
        <field name="arch" type="xml">
            <xpath expr="http://field[@name='line_ids']//field[@name='account_id']" position="after">
                <field name='need_vehicle' invisible='1'/>
                <field name='vehicle_id' attrs="{'required': [('need_vehicle', '=', True), ('parent.move_type', '=', 'in_invoice')], 'column_invisible': [('parent.move_type', '!=', 'in_invoice')]}" optional='hidden'/>
            </xpath>
            <xpath expr="http://field[@name='invoice_line_ids']//field[@name='account_id']" position="after">
                <field name='need_vehicle' invisible='1'/>
                <field name='vehicle_id' attrs="{'required': [('need_vehicle', '=', True), ('parent.move_type', '=', 'in_invoice')], 'column_invisible': [('parent.move_type', '!=', 'in_invoice')]}" optional='hidden'/>
            </xpath>
        </field>
    </record>
</odoo>

練習(xí)--添加字段到用戶視圖

添加property_ids字段到 base.view_users_form 中新建的notebook

提示: 可以在 這里找到繼承用戶視圖的示例。

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>

    <record id="res_users_view_form" model="ir.ui.view">
        <field name="name">res.users.view.form.inherit.gamification</field>
        <field name="model">res.users</field>
        <field name="inherit_id" ref="base.view_users_form"/>
        <field name="arch" type="xml">
            <group name="messaging" position="inside">
                <field name="karma"/>
            </group>
        </field>
    </record>

</data>
</odoo>

新增odoo14\custom\estate\views\estate_res_users_views.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
    <record id="estate_res_users_view_form" model="ir.ui.view">
        <field name="name">estate.res.users.view.form</field>
        <field name="model">res.users</field>
        <field name="inherit_id" ref="base.view_users_form"/>
        <field name="arch" type="xml">
            <xpath expr="http://page[@name='references']" position="after">
                <page string="Real Estate Properties" name="RealEstateProperties">
                    <field name='property_ids'/>
                </page>
            </xpath>
        </field>
    </record>
</data>
</odoo>

修改odoo14\custom\estate\__manifest__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
{
    'name': 'estate',
    'depends': ['base'],
    'data':['security/ir.model.access.csv',
            'views/estate_property_views.xml',
            'views/estate_property_type_views.xml',
            'views/estate_property_tag_views.xml',
            'views/estate_property_offer_views.xml',
            'views/estate_menus.xml',
            'views/estate_res_users_views.xml' # 本次新增
            ]
}

重啟服務(wù),驗(yàn)證效果

odoo 開發(fā)入門教程系列-繼承(Inheritance)文章來源地址http://www.zghlxwxcb.cn/news/detail-413421.html

到了這里,關(guān)于odoo 開發(fā)入門教程系列-繼承(Inheritance)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第3章_瑞薩MCU零基礎(chǔ)入門系列教程之開發(fā)環(huán)境搭建與體驗(yàn)

    第3章_瑞薩MCU零基礎(chǔ)入門系列教程之開發(fā)環(huán)境搭建與體驗(yàn)

    本教程基于韋東山百問網(wǎng)出的 DShanMCU-RA6M5開發(fā)板 進(jìn)行編寫,需要的同學(xué)可以在這里獲取: https://item.taobao.com/item.htm?id=728461040949 配套資料獲?。篽ttps://renesas-docs.100ask.net 瑞薩MCU零基礎(chǔ)入門系列教程匯總 : https://blog.csdn.net/qq_35181236/article/details/132779862 本章目標(biāo): 搭建 Renesas 的

    2024年02月09日
    瀏覽(25)
  • 視頻教程 | 長安鏈推出系列視頻教程合集(入門)

    視頻教程 | 長安鏈推出系列視頻教程合集(入門)

    區(qū)塊鏈技術(shù)脫離數(shù)字貨幣實(shí)現(xiàn)產(chǎn)業(yè)化應(yīng)用的時(shí)間還相對短,處于逐步融入產(chǎn)業(yè)化發(fā)展的初期;同時(shí)區(qū)塊鏈技術(shù)涉及到密碼學(xué)、存儲、網(wǎng)絡(luò)、共識算法等多個(gè)領(lǐng)域,是一門跨學(xué)科、復(fù)合型的技術(shù)?!靶隆焙汀皬?fù)合”使得部分開發(fā)者,尤其是剛開始面對數(shù)字化轉(zhuǎn)型的行業(yè)開發(fā)者對

    2023年04月17日
    瀏覽(29)
  • ActiveMQ詳細(xì)入門教程系列

    ActiveMQ詳細(xì)入門教程系列

    兩個(gè)系統(tǒng)或兩個(gè)客戶端之間進(jìn)行消息傳送,利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。 消息中間件,總結(jié)起來作用有三個(gè): 異步化提升性

    2024年02月15日
    瀏覽(29)
  • WPF入門教程系列一——基礎(chǔ)

    WPF入門教程系列一——基礎(chǔ)

    一、?前言?? ?? ????? 最近在學(xué)習(xí)WPF,學(xué)習(xí)WPF首先上的是微軟的MSDN,然后再搜索了一下網(wǎng)絡(luò)有關(guān)WPF的學(xué)習(xí)資料。為了溫故而知新把學(xué)習(xí)過程記錄下來,以備后查。這篇主要講WPF的開發(fā)基礎(chǔ),介紹了如何使用Visual?Studio?2013創(chuàng)建一個(gè)WPF應(yīng)用程序。 首先說一下學(xué)習(xí)WPF的基礎(chǔ)知

    2024年02月07日
    瀏覽(32)
  • 【PyTorch教程】pytorch入門系列 ——土堆教程的目錄及索引

    一、幾句題外話 深度學(xué)習(xí)上手已經(jīng)很長時(shí)間了,還記得最初的入門是跟著 B站up小土堆 的一步步學(xué)起來的,從起初的環(huán)境配置,到現(xiàn)在調(diào)整整個(gè)模型的進(jìn)階,非常感謝土堆的貢獻(xiàn)。 寫這個(gè)博客的初衷是為了自己 看著方便 ,由于多臺電腦多個(gè)環(huán)境下查看這些內(nèi)容很麻煩,所以

    2024年03月17日
    瀏覽(33)
  • 數(shù)據(jù)倉庫系列:StarRocks 入門培訓(xùn)教程

    數(shù)據(jù)倉庫系列:StarRocks 入門培訓(xùn)教程

    其它文章請參考 數(shù)據(jù)倉庫系列:StarRocks 下一代高性能分析數(shù)據(jù)倉庫的架構(gòu)、數(shù)據(jù)存儲及表設(shè)計(jì) 數(shù)據(jù)倉庫系列:StarRocks的簡單試用及與clickhouse的對比 數(shù)據(jù)倉庫系列:如何將StarRocks集群與Jupyter集成? StarRocks 是一款MPP DB, 對標(biāo)ClickHouse、Vertica、Teradata、Greenplum,在查詢性能上遠(yuǎn)

    2024年02月11日
    瀏覽(33)
  • Midjourney學(xué)習(xí)系列之一 —— 保姆級入門教程

    Midjourney學(xué)習(xí)系列之一 —— 保姆級入門教程

    繼ChatGPT之后,AI繪圖網(wǎng)站Midjourney也已經(jīng)火出圈了。鑒于其強(qiáng)大的繪圖能力和極低的使用門檻,Midjourney已經(jīng)在事實(shí)上被各行各業(yè)的人作為輔助工具了,更重要的是,它絕對是一個(gè)非常理想的學(xué)習(xí)AI技術(shù)的引路人。 因此我在文章《一文了解AI繪圖所有,含福利》中呼吁,每一個(gè)大

    2024年02月11日
    瀏覽(15)
  • WPF入門教程系列三十 ——DataGrid驗(yàn)證

    WPF入門教程系列三十 ——DataGrid驗(yàn)證

    WPF入門教程系列目錄 WPF入門教程系列二——Application介紹 WPF入門教程系列三——Application介紹(續(xù)) WPF入門教程系列四——Dispatcher介紹 WPF入門教程系列五——Window 介紹 WPF入門教程系列十一——依賴屬性(一) WPF入門教程系列十五——WPF中的數(shù)據(jù)綁定(一) ? ???????? DataG

    2024年02月12日
    瀏覽(27)
  • 【瑞薩零基礎(chǔ)入門】瑞薩MCU零基礎(chǔ)入門系列教程(更新連載中)

    【瑞薩零基礎(chǔ)入門】瑞薩MCU零基礎(chǔ)入門系列教程(更新連載中)

    得益于瑞薩強(qiáng)大的MCU、強(qiáng)大的軟件開發(fā)工具(e2 studio),也得益于瑞薩和RA生態(tài)工作室提供的支持,我們團(tuán)隊(duì)編寫了《ARM嵌入式系統(tǒng)中面向?qū)ο蟮哪K編程方法》,全書37章,將近500頁: 講解面向?qū)ο缶幊淘趩纹瑱C(jī)開發(fā)中的使用 結(jié)合FSP軟件包實(shí)例分析外設(shè)驅(qū)動 講解如何使用RASC配

    2024年02月09日
    瀏覽(60)
  • (9)OpenCV深度學(xué)習(xí)系列教程——PyTorch入門

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) PyTorch是一個(gè)由Facebook開發(fā)的開源機(jī)器學(xué)習(xí)框架,它提供了一整套用于訓(xùn)練、評估和部署深度學(xué)習(xí)模型的工具和方法。隨著深度學(xué)習(xí)在各個(gè)領(lǐng)域的應(yīng)用越來越廣泛,PyTorch作為一個(gè)成熟的框架已經(jīng)成為機(jī)器學(xué)習(xí)研究人員的必備工具。本系列教程從

    2024年02月07日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包