本人刚刚接触odoo12,大概有2个多月的时间,这两天有点时间,就集中写下博客。

  本来是打算整理成笔记,想到这段时间的开发经历,着实感觉网上有关odoo的资料太少,学习资料也不多,既然与odoo有缘,想系统的整理下这段时间的心得体会,与有缘人分享,也算是响应了IT行业的宗旨了。

  废话少说,展开正题:

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

  这个系列教程对我影响很大,在此,对大神Alan Hou表示衷心感谢

  我主要是想通过简单的例子,对一些odoo开发中常用的技术进行说明:

  第一篇要说的是添加字段:这也是我接触odoo12最开始的工作。

  准备工作:

  运行odoo,安装销售、采购、联系人三个模块,用于演示添加字段。

在视图中添加字段:

  

  以上是原销售订单form页面,我想在``客户``字段下增加``销售员``字段(从联系人直接关联)(sale.order是有的,用于演示)。

# -*- coding:utf- -*-
"""销售模块扩展""" 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()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页中和明细中添加字段时会经常遇到。

  上述的基本方法能够适用大部分的情况了,后一篇补充下在明细中添加计算字段的情况。

odoo12 修行基础篇之 添加字段 (一)的更多相关文章

  1. odoo12 修行基础篇之 添加明细字段 (二)

    前一篇介绍了如何在视图和表单中添加字段.本节内容,我们讨论下如何在明细中加字段. 我想在销售页面明细中增加税额字段,这在表sale.order.line中已经存在,在此仅用来演示. odoo的明细一般 ...

  2. SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...

  3. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  4. SQL Server调优系列基础篇(常用运算符总结)

    原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握 ...

  5. DDD分层架构之领域实体(基础篇)

    DDD分层架构之领域实体(基础篇) 上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自<领域驱动设计C#2008实现>,另外参考了网上找到的一些示 ...

  6. 讲讲Linq to SQL映射(基础篇)

    讲讲Linq to SQL映射(基础篇) 这篇主要讲Linq to  SQL基于属性的映射.即映射数据库,映射表,映射列,映射关系,映射存储过程, 映射函数.然而创建这种映射有三种方法,他们分别是OR ...

  7. Python 经典面试题汇总之基础篇

    基础篇 1:为什么学习Python 公司建议使用Python,然后自己通过百度和向有学过Python的同学了解了Python.Python这门语言,入门比较简单,它简单易学,生态圈比较强大,涉及的地方 ...

  8. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  9. 聊聊数据库~3.SQL基础篇

    上篇回顾:聊聊数据库~SQL环境篇 扩展:为用户添加新数据库的权限 PS:先使用root创建数据库,然后再授权grant all privileges on 数据库.* to 用户名@"%& ...

随机推荐

  1. C# 中yield关键字解析

    前言 前段时间了解到yield关键字,一直觉得还不错.今天给大家分享一下yield关键字的用法.yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素.具体如何使用yi ...

  2. MyEclipse 2013配置JDBC连接mySQL||Tomcat 7.0 8.0 配置 JDBC |配置mysql-connector-java-5.1.16

    MyEclipse->Preferences->MyEclipse->Severs->Intergated Sandbox->Myeclipse Tomcat 7(或者T ...

  3. web前端面试题(含答案)

    HTML+CSS1.对WEB标准以及W3C的理解与认识标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所 ...

  4. 设计模式C++描述----08.原型(Prototype)模式

    一. 概述 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 换句话说,就是不用重新初始化对象,而是动态地获得对象运行时的状态. 再说明白点,就是要一个拷贝过构造函数类似功能的接 ...

  5. Rest_Framework之频率组件部分

    一.RestFramework之频率组件源码部分 频率组件的源码部分和权限组件流程一模一样的,这里就不多说了,直接上源码的主要逻辑部分: def check_throttles(self, reque ...

  6. java和python对比

    一:解释性和编译型 梳理 编译型:源代码经过编译直接变为二进制的机器语言,每次都可以直接重新运行不需要翻译.典型的就是c语言. 解释性:java和python都是解释型,源代码经过编译变为字节码文件, ...

  7. php curl 生成的cookie 文件含义 cookie 属性含义

    最近用了curl 感觉还是很方便的,看了下curl生成的 cookie 文件 格式 , 对其中一些值的含义不是很明白,去找了些cookie的资料看了下,做下备忘 PHP curl 生成 的 cooki ...

  8. Python进阶函数

    一.函数的动态参数 之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数. 动态 ...

  9. Spring Boot实战之定制type Formatters

    本文首发于个人网站:Spring Boot实战之定制type Formatters 前面我们有篇文章介绍了PropertyEditors,是用来将文本类型转换成指定的Java类型,不过,考虑到Prop ...

  10. NOIP模拟 39

    考的嘛也不是. 伤心(怎么可能) T1稍想想组合数,然后牢记: 取模题随时取模,包括刚刚读入的数据  T2想到了基环树,然而不会打QAQ.. 非常简洁但非常大神的做法:随便断掉环上的一条边 利用“这条 ...