odoo12 修行基礎篇之 添加字段 (一)


  本人剛剛接觸odoo12,大概有2個多月的時間,這兩天有點時間,就集中寫下博客。

  本來是打算整理成筆記,想到這段時間的開發經歷,着實感覺網上有關odoo的資料太少,學習資料也不多,既然與odoo有緣,想系統的整理下這段時間的心得體會,與有緣人分享,也算是響應了IT行業的宗旨了。

  廢話少說,展開正題:

  odoo基礎教程,比如odoo12的:https://alanhou.org/odoo-12-development/

  這個系列教程對我影響很大,在此,對大神Alan Hou表示衷心感謝

  我主要是想通過簡單的例子,對一些odoo開發中常用的技術進行說明:

  第一篇要說的是添加字段:這也是我接觸odoo12最開始的工作。

  准備工作:

  運行odoo,安裝銷售、采購、聯系人三個模塊,用於演示添加字段。

在視圖中添加字段:

  

  以上是原銷售訂單form頁面,我想在``客戶``字段下增加``銷售員``字段(從聯系人直接關聯)(sale.order是有的,用於演示)。

# -*- coding:utf-8 -*-
"""銷售模塊擴展"""

from odoo import fields, models # 銷售模塊擴展 class SaleOrderExtension(models.Model): """銷售模塊擴展""" _inherit = 'sale.order'
# 銷售員 x_salesman
= fields.Many2one( 'res.users', string='銷售員', related='partner_id.user_id' )

  在models目錄中創建sale_order_extension.py文件

  在models/__init__.py文件中引用該文件

  related可以通過當前類的某個關聯字段,關聯到該字段所關聯模型中的其它字段。

  比如上述就是通過sale.order模型中的partner_id字段,關聯到res.partner中的user_id字段

  注意的是:x_salesman的關聯模型是res.users,與user_id的字段屬性是一致的,否則會報如下錯誤:

/home/sam/odoo12/odoo/odoo/fields.py(2139)convert_to_cache() raise ValueError("Wrong value for %s: %r" % (self, value))

  就是因為我把res.users搞成了res.partner

x_salesman = fields.Many2one( 'res.partner', string='銷售員', related='partner_id.user_id' )

  還有可能遇到這樣的錯誤:

TypeError: Model 'sale.order' does not exist in registry.

  這是由於在__manifest__.py文件中的'depends'中沒有引入對應模塊導致的:

'depends': ['base',],

  修改如下:

'depends': ['base', 'sale',],

  這個'sale'索引用的是目錄名,因為添加字段所繼承的sale.order模型就在sale目錄下:

  / home / sam / odoo12 / odoo / addons / sale / models / sale.py

  在views目錄中創建sale_order_extension.xml文件,代碼如下:

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

    <record id="view_order_form_modify" model="ir.ui.view">
        <field name="name">view.order.form.modify</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_order_form"/>
        <field name="arch" type="xml">
            <!-- 增加``銷售員``字段 -->
            <xpath expr="//group/group/field[@name='partner_id']" position="after"
            >
                <field name="x_salesman" />
            </xpath>
        </field>
    </record>

</odoo>

  對於xml文件的修改,可能報如下錯誤:

元素 '<xpath expr="//group/div/field[@name='partner_id']">' 在母級視圖中沒有找到

  注意我把group修改成了div,這屬於xpath寫錯了

  還有可能也報類似的問題,但是問題原因並不是xpath,而是繼承的視圖的外部ID不對

  如我把外部ID修改成如下,也會報類似錯誤:

<field name="inherit_id" ref="base.res_partner_kanban_view"/>
元素 '<xpath expr="//group/group/field[@name='partner_id']">' 在母級視圖中沒有找到

  關於找外部ID的方法,有幾個技巧可以分享給大家:

  找form、tree、kanban等odoo自帶類型,可以使用如下方式:

  開啟開發者模式,點擊右上角的debug圖標

  選擇下拉菜單中的相關項,具體可自己試驗

  可以在彈出的頁面中找到外部ID

  找按鈕的外部ID,可以使用如下方式:

  打開谷歌瀏覽器:

  右鍵點擊一個按鈕,選擇檢查

  紅框圈出的就是這個按鈕對應的外部ID,這個在添加按鈕權限時,非常好用。

  可以看看字段添加后的效果,不可編輯,如果在聯系人中修改了銷售員字段,在選擇客戶時會自動帶出,並顯示在頁面中。

在列表中添加字段:

   在列表中添加字段:

  我想在Quotation Date后面增加創建人,使用系統默認字段create_uid,只添加xml就可以了

  在上述的xml文件中,補充如下代碼:

<record id="view_order_tree_modify" model="ir.ui.view">
        <field name="name">view.order.form.modify</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_quotation_tree_with_onboarding"/>
        <field name="arch" type="xml">
            <!-- 增加``創建人``字段 -->
            <xpath expr="//field[@name='date_order']" position="after"
            >
                <field name="create_uid" />
            </xpath>
        </field>
 </record>

  其它的odoo自帶的添加字段的方式與上述相同

  需要注意的就是外部ID的引用,以及xpath的使用

  有時可能會遇到修改無效也不報錯的情況,很有可能是文中有多個相同字段,你的xpath並沒有選中你想要修改的字段。

  這在TAB頁中和明細中添加字段時會經常遇到。

  上述的基本方法能夠適用大部分的情況了,后一篇補充下在明細中添加計算字段的情況。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM