odoo12 修行基础篇之 添加明细字段 (二)
前一篇介绍了如何在视图和表单中添加字段。本节内容,我们讨论下如何在明细中加字段。
我想在销售页面明细中增加税额字段,这在表sale.order.line中已经存在,在此仅用来演示。
odoo的明细一般都是One2many字段,通过Tab页或直接以列表形式展示在表单视图中,如下:
主要关注的是字段名order_line,属于模型sale.order,是一个one2many字段,关联的是sale.order.line模型。展示的列表如下:

订单行如图所示,列表中所展示的字段,都是sale.order.line模型中的字段。
因此,我们要想在订单行(以下简称明细)中增加字段,就需要在对应的sale.order.line模型中添加字段。
在models目录中创建sale_order_line_extension.py文件,在__init__.py文件中引用。
sale_order_line_extension.py中代码如下:
# -*- coding:utf-8 -*-
"""销售订单行扩展""" from odoo import models, fields, api # 销售订单行扩展
class SaleOrderLineExtension(models.Model):
"""销售订单行扩展"""
_inherit = 'sale.order.line' # 税额
x_price_tax = fields.Monetary(string='税额', compute='_get_line_price_tax') # 获取订单行税额
@api.multi
def _get_line_price_tax(self):
"""
获取订单行税额
:return: None
"""
if self:
# self是订单行对象数据集
# 遍历数据集
for line in self:
# 税率
tax = sum(line.tax_id.mapped('amount')) / 100
# 单价
price = line.price_unit
# 数量
number = line.product_uom_qty
# 税额 = 不含税销售额 × 税率
# 不含税销售额 = 含税价 / (1 + 税率)
line.x_price_tax = (price / (1 + tax) * tax) * number
增加的税额字段x_price_tax是一个Monetary字段,在odoo中主要用于货币问题,需要定义一个currency_id字段,并在xml中引用。
currency_id = fields.Many2one('res.currency', 'Currency')
<tree>
<field name="currency_id" invisible="1" />
<field name="x_price_tax" />
</tree>
在xml中增加currency_id字段后,主要效果是出现了货币符号。(个人观点,不知是否正确,供参考)
在源码的tree中已经存在该字段,不需要添加,上面仅用于演示。
另外,x_price_tax字段是一个计算字段,这种类型的字段不会存储到数据库中,如果需要存储,可以增加stroe=True属性。
x_price_tax = fields.Monetary(string='税额', store=True, compute='_get_line_price_tax')
在代码中,我使用了mapped()函数处理了一个many2many字段tax_id。这个函数是odoo提供的,能够直接提取出某个字段的列表,或使用一个lambda表达式,对要获取的值进行加工处理。这个方法在实际开发中,是很常用的,主要用于2many字段。
打开销售页面,self对应的是一个sale.order.line数据集,可以通过遍历的方式,获取每一个数据集,对每个数据集的数据进行处理。这在处理明细逻辑时要注意,很容易出现的错误是:
sale.order.line(1, 2)
/home/sam/odoo12/odoo/odoo/models.py(4692)ensure_one()
raise ValueError("Expected singleton: %s" % self)
我只是在代码中增加了:
self.x_price_tax = 0
报错的原因就是self是一个多订单行的数据集,对于数据集的处理要确保是单一对象。
注意:如果你加了store=True,只会在第一次加载时进行计算,当第二次加载时就从数据库中直接查询了。
下面是xml中的内容:
<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>
<!-- 在订单行中,增加``税额``字段 -->
<xpath expr="//tree/field[@name='tax_id']"
position="after"
>
<field name="x_price_tax" />
</xpath>
</field>
</record>
可能会有疑惑,为什么sale.order.line中的字段可以直接加在sale.order模型的视图中。我们来看一下源码:
<page string="Order Lines" name="order_lines">
<field name="order_line">
<tree string="Sales Order Lines">
<field name="tax_id" />
</tree>
由于源码太多,我不得不对它进行删减,说明问题足够了,源码是开发过程中最好的老师。
在page标签内,有一个字段,该字段就是订单行order_line。
能够看到tree标签是添加在order_line字段内部的,我们新增的字段是增加到tree标签内的。实际上,我们是在定义的sale.order.line的列表中增加了一个税额字段。因此,odoo并没有提示错误。
如果,我们在销售员字段所在的视图中添加税额,则会报如下错误:
字段`x_price_tax`不存在
<xpath expr="//group/group/field[@name='partner_id']" position="after">
<field name="x_salesman" />
<field name="x_price_tax" />
</xpath>
添加成功后显示如下:

在明细中添加字段的介绍,就介绍到这,下一篇我们来讨论下如何添加按钮。
odoo12 修行基础篇之 添加明细字段 (二)的更多相关文章
- odoo12 修行基础篇之 添加字段 (一)
本人刚刚接触odoo12,大概有2个多月的时间,这两天有点时间,就集中写下博客. 本来是打算整理成笔记,想到这段时间的开发经历,着实感觉网上有关odoo的资料太少,学习资料也不多,既然与odoo有缘, ...
- cocos2dx基础篇(13) 编辑框之二CCEditBox
[3.x] (1)去掉"CC" (2)设置虚拟键盘的编辑类型 > EditBoxInputMode 变为强枚举 EditBox::EditBoxInputMode // SI ...
- ESP8266开发之旅 基础篇④ ESP8266与EEPROM
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇① 走进ESP8266的世界
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- Python基础篇【第7篇】: 面向对象(2)
上一篇<初识面向对象>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公 ...
- SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...
随机推荐
- vscode自定义颜色主题插件并发布
生成一个新的颜色主题 运行命令 npm install -g yo generator-code yo code 这时默认文件目录已经帮你创建好了 vscode中按下F5可以帮你打开调试,预览创建好的 ...
- C加加学习之路 2——两招让你成为牛X的T型人才
有个小伙伴在微信上问我: 我刚工作半年,有时候对于Java的发展方向有点迷茫,Java的范围是在是太广了,我有时候会不知道从哪开始入手,我想问一下,您有什么好的建议吗? 我理解这位朋友的问题是:工作中 ...
- mysql的一些常用操作(二)
紧跟上一节,我们创建了四个表: Student.Teacher.Course.Score 接下来就是实际的一些操作了:1.求每门课程的学生人数. select course.cname '课程名称', ...
- Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)
最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...
- Oracle大规模数据快速导出文本文件
哈喽,前几久,和大家分享过如何把文本数据快速导入数据库(点击即可打开),今天再和大家分享一个小技能,将Oracle数据库中的数据按照指定分割符.指定字段导出至文本文件.首先来张图,看看导出的数据是什么 ...
- 【IntelliJ IDEA】 常用快捷键列表
1.常用Shortcut F2 或Shift+F2 高亮错误或警告快速定位 Ctrl+Up/Down 光标跳转到第一行或最后一行下 Ctrl+B 快速打开光标处的类或方法 CTRL+ALT+B 找 ...
- Microsoft.Extensions.DependencyInjection 之三:展开测试
目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...
- nginx篇高级之优化整理
优化思路: 一.修改连接数和工作线程让其支持更多的并发量. worker_processes 2; //与CPU核心数量一致 worker_connections ...
- CSPS模拟 60
T1 m+logn的约瑟夫 T2 考数学的Bit T3 很裸但就是不会打的LCIS 哭哭. 如果下次还考这种题我一定要想出来.
- 【实用工具】这些你不得不知道的chrome插件,让你事半功倍
平时chrome插件用多了,发现在工作中有很多插件特别好用,让你事半功倍.于是我抽时间整理了一些非常好用的chrome插件分享给大家,其中有些插件是我已经离不开,每天都在用的.希望这篇文章能帮助你找到 ...