本人刚刚接触odoo12,大概有2个多月的时间,这两天有点时间,就集中写下博客。浏览器
原本是打算整理成笔记,想到这段时间的开发经历,着实感受网上有关odoo的资料太少,学习资料也很少,既然与odoo有缘,想系统的整理下这段时间的心得体会,与有缘人分享,也算是响应了IT行业的宗旨了。学习
废话少说,展开正题:ui
odoo基础教程,好比odoo12的:https://alanhou.org/odoo-12-development/spa
这个系列教程对我影响很大,在此,对大神Alan Hou表示衷心感谢!debug
我主要是想经过简单的例子,对一些odoo开发中经常使用的技术进行说明:3d
第一篇要说的是添加字段:这也是我接触odoo12最开始的工做。code
准备工做:orm
运行odoo,安装销售、采购、联系人三个模块,用于演示添加字段。xml
在视图中添加字段:blog
以上是原销售订单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页中和明细中添加字段时会常常遇到。
上述的基本方法可以适用大部分的状况了,后一篇补充下在明细中添加计算字段的状况。