本人剛剛接觸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頁中和明細中添加字段時會經常遇到。
上述的基本方法能夠適用大部分的情況了,后一篇補充下在明細中添加計算字段的情況。