odoo中使用onchange方法基本操作

odoo15 自带的api装饰器 depends与onchange解析 Odoo自带的api装饰器常用的主要有:split_context,depends_context,model,constrains,depends,onchange,returns 七个装饰器。 目录 1、split_context 2、depends_context 3、model 4、contrains 5、depends 6、onchange 7、return 1、split_context 从一对位置参数和关键字参数中提取上下文。 返回三个“`context,args,k 阅读详情

在Odoo中,onchange方法用于在用户界面上动态更新字段值,而compute方法则用于计算字段的值。这两种方法通常用于表单视图,以提供动态和互动的用户体验。下面将通过一个例子来详细解释如何在Odoo中定义和使用onchange和compute方法,包括在服务端调用onchange方法。

定义onchange方法

在Odoo模型中定义onchange方法,可以使用@api.onchange装饰器。这个装饰器使得在字段值变化时自动触发特定的方法。这里是一个简单的例子:

from odoo import models, fields, api

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    product_qty_available = fields.Float(string='Quantity Available', readonly=True)

    @api.onchange('product_id')
    def _onchange_product_id(self):
        for record in self:
            if record.product_id:
                record.product_qty_available = record.product_id.qty_available

在这个例子中,我们扩展了sale.order.line模型,添加了一个名为product_qty_available的只读字段,用来显示产品的可用数量。通过使用@api.onchange('product_id')装饰器,我们定义了一个_onchange_product_id方法,这意味着每当product_id字段的值改变时,这个方法就会被自动调用。在这个方法中,我们更新了product_qty_available字段的值,使其反映所选产品的实际库存数量。

使用compute方法调用onchange

如果你想要通过compute方法来间接触发与onchange相似的逻辑,你可以定义一个计算字段,并在其计算方法中包含你想要执行的逻辑。这里是一个例子:

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    product_qty_available = fields.Float(string='Quantity Available', readonly=True, compute='_compute_qty_available')

    @api.depends('product_id')
    def _compute_qty_available(self):
        for record in self:
            if record.product_id:
                record.product_qty_available = record.product_id.qty_available

在这个例子中,product_qty_available现在是一个计算字段,其值由_compute_qty_available方法计算得出。这个方法通过@api.depends('product_id')装饰器声明依赖于product_id字段,这意味着每当product_id的值发生变化时,_compute_qty_available方法会被自动调用,从而更新product_qty_available字段的值。

总结

在Odoo中,onchange和compute方法提供了动态更新字段值的机制,分别用于用户界面的实时响应和字段值的自动计算。虽然通常不直接在服务端调用onchange方法,但可以通过适当的设计来模拟相似的行为,或者通过compute方法实现字段值的动态更新。

odoo定时执行onchange事件模块 安装该模块后,对于有写onchange方法的字段,可以设置定时执行时间间隔。 立即下载

相关推荐

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文详细介绍了如何在PHP项目中快速集成SM4国密加密算法,提供完整的代码实现和实际应用示例。从算法原理到核心代码解析,再到性能优化与安全实践,帮助开发者高效实现数据加密功能,满足金融、政务等领域的合规需求。

weixin_29315569的博客 354

odoo-onchange

odoo13 ONCHANGE当字段被设置为只读时,如何保存到数据库场景:1、实现通过页面某字段数据关联出对应数据表的其他字段的数据;2、将页面数据进行计算并保存到数据表相关属性:onchange + related + readonly + store实现方法:方法一、对于直接可以关联过来的字段,采用related 属性将字段属性关联过来,设置readonly=True,并通过store=True进行保存,代码片段如下:方法二、对于model中某些字段,不能直接依赖related 进行关联,只能通过onc

weixin_43846708的博客 828

Python 高级语法:闭包

闭包(Closure)是函数式编程中的一个重要概念。在Python中,闭包可以简单理解为:一种特殊的函数。外函数:嵌套函数中最外层的函数称之为外函数。内函数:嵌套函数中最内层的函数称之为内函数;内函数引用了外函数的临时变量;外函数的返回使用了临时变量的内函数。

moment159的博客 2354

odoo新手创建模块(七)--onchange的使用

一.前端校验(onchange) 定义:当参数字段的值变化时便开始检查,如果检查不通过,则字段值不会发生变化,在前端页面也会抛出一个异常,更多修饰器请移步(小白读odoo参考手册–修饰器) 一段好的代码,必须要有好的后端代码,为了良好的用户体验,也应当有比较合理的前端功能,定义很枯燥,我们就直接在代码中体会吧. 如图,后端的代码,只在保存时调用,当检查不通过时,抛出异常,这没什么,只是用户辛辛苦苦输入了好久,只因为一个疏忽(名字输入重复),一切都要重新开始输入,这样的用户体验极差: 我们用前端校验实现其优

m0_56227168的博客 1080

浅谈天线 - - - GNSS/BT/4G/2.4G

全球定位导航系统,最成熟的就是美利坚,我大中华,俄罗斯,还有就是欧洲的一个(太次不谈)所以我们在项目调试的时候,小尺寸的陶瓷天线上一般兼容2个频段,体积大一点的可以兼容三个频段,采用组合的形式 GPS+BD GPS+GLONASS GLONASS+BD 或者是单频段的定位天线陶瓷PATC陶瓷片:陶瓷片面积越大,介电常数越大,其共振频率越高,接收效果越高,这就是为什么都推荐使用大一点的陶瓷天线的原因银层:陶瓷天线表面的银层可以影响天线的共振频率,理想的GNSS陶瓷片频点准确落在1575.42MH

BLACKHOLE6的博客 1万+

计算三维空间中AOA定位的 CRLB(Cramér–Rao 下界,克拉美罗下界)公式与MATLAB例程

摘要:本文介绍了三维空间中基于AOA(到达角度)测量的目标定位CRLB(Cramér–Rao下界)计算方法。通过定义目标位置向量、传感器位置和AOA测量角度(方位角与俯仰角),推导了方向向量和雅可比矩阵的表达式,并构建Fisher信息矩阵计算CRLB。提供了MATLAB例程实现该算法,包括参数设置、CRLB计算和可视化(3σ误差椭球)。实验结果表明,当目标位置偏离传感器阵列时,定位误差显著增大。该方法适用于评估AOA定位系统的理论性能极限,为导航与定位算法设计提供参考。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 588

Odoo | 入门 | (6)-Onchange(基于Odoo12)

Onchange方法   onchange方法的效果就想让用户在填写一张单据时,比如填写了一个字段,界面上的其他字段很肯能就可以通过填写的这个字段来动态更新,进而做到数据还没有保存到数据库的情况下,对表单的数据做一个更新。   开发步骤:     1. 写一个方法用来接收某一个字段改变后,其他字段的赋值     2. 对方法使用@api.onchange(‘fields1’)的装饰器     3....

解决自己遇到的问题 分享认为有意义的知识 提供有一点点参考价值的灵感 1066

华为od 面试八股文_Python语言_01_含答案

华为od 面试八股文_Python语言_01_含答案

MISAYAONE的博客 9120

odoo16装饰器分析 onchange,constrains,depends

odoo16 装饰器理解

hebuyong的博客 572

RNA-seq分析:Step8(富集分析)

RNA-seq富集分析是一种用于分析基因表达数据中特定基因或通路是否富集的分析方法。其基本思想是比较不同基因对应的转录本/基因之间的表达差异及其对应的基因注释信息,通过统计学方法评估差异的显著性,从而确定是否存在某些特定的功能通路或基因集合富集的情况。常用的RNA-seq富集分析工具包括GOseq、KEGG(KEGG enrichment analysis)、DAVID(Database for Annotation, Visualization and Integrated Discovery)等。这

沉香best的博客 3634

【Codecs系列】HEVC-SCC(一):核心技术介绍

DATE: 2020.6.4【Tags: HEVC SCC】 1、参考网址 2、SCC简介 3、HEVC-SCC核心技术

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 4806

odoo14 @api.onchange装饰器的返回值使用操作

odoo14,onchange装饰器的返回值使用操作,其中可以包含以下键,'value': 用于更新字段的新值。这个键对应的值是一个字典,其中包含要更新的字段名及其新的值。当字段的值发生变化时,这些新的值将被用于更新与这些字段相关的视图部分,'warning': 用于显示警告信息。这个键对应的值是一个字典,其中包含了用于显示警告的信息,如标题、消息和类型。

weixin_62077901的博客 1万+

YOLOv8损失函数改进大全:从IoU到FocusIoU的20+种变体全解析(附完整适配代码+性能对比)

目标检测边界框损失函数演进与优化 摘要:边界框损失函数是目标检测模型定位精度的关键因素。本文系统分析了从基础IoU到最新FocusIoU的20余种损失函数的演进历程,包括四代主要技术:基于重叠区域的IoU/GIoU,结合距离度量的DIoU/CIoU,优化形状匹配的EIoU/RIoU,以及考虑方向性的SIoU/WIoU/FocusIoU。针对YOLOv8模型,提供了完整的损失函数实现代码和替换方案,实验表明优化后的损失函数在复杂场景下可提升mAP@0.5达3.2%。文章特别对比了不同损失在小目标、遮挡和密集场

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 996

odoo10下设置onchange方法定时执行

因圈内朋友需求,某个字段的值是通过后台py方法获取,业务逻辑是写在该字段的onchange方法中,前台操作时,默认只有该字段值发生改变时才会触发后台方法,现在他希望前台js能定时触发该字段的onchange事件,调用后台方法返回值。经过分析odoo的onchange触发机制及工作流程,写了一个模块,可以方便开发人员处理该类型的业务需求。安装该模块后,针对需处理的字段定义一个onchange方法,如...

vnsoft的专栏 1912

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

odoo 学习笔记 - 计算字段、onchange 机制、模型约束

文章目录Domain计算字段和默认值说明依赖默认值onchange 机制模型约束 Domain Domain 代表记录集的条件表达式。Domain 是定义模型子集的规则集合。每个规则是一个包含名称、操作和值的三元组 例如,下面是Product模型子集的Domain表达式,“单价大于1000且类型为服务”的记录集: [('product_type', '=', 'service'), ('unit_...

Python相关分享 4054

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

odoo14中 @api.onchange(),compute的@api.depends(),@api.constrains()的使用事项

在Odoo 14中,@api.onchange()、@api.depends() 和 @api.constrains() 都是装饰器,用于定义特定类型的方法,以便实现不同的功能。这些装饰器分别用于字段值变化时的动作、计算字段值的逻辑以及在保存记录前执行的验证。

weixin_62077901的博客 4576

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

odoo10中onchange改变的domain问题

在odoo的有些模块应用中,在onchange中可能会改变其他字段的domain条件,比如询价单中,改变明细的产品时,在onchange中会根据产品资料中的单位组类型,设置明细行中单位的domain条件,这样在下拉选择时,你就只能选择某几个单位。但如果是针对已有的明细行进行修改(不改产品,只改单位),因为没有触发onchange事件,所以这个时候你会发现所有单位都在下拉列表中,并不只是当前产品对应...

vnsoft的专栏 1662

odoo-onChange

"onchange"机制为客户端界面提供了一个更新表单的方法,任何时候用户在一个字段中填写值时就会触发,不需要保存任何数据到数据库中。 例如,假如一个模型有三个字段分别为amount,unit_price和price,当其他任意字段被修改时,您希望在表单中更新价格字段。要实现这个效果,定义一个方法,self代表表单视图中的记录,使用onchange()装饰,指定它在哪个字段上触发。任何...

351

Odoo onChange使用

转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826155.html 转载请注明原文地址: 【onchange=前端js函数,可以实现前端实时更新以及修改验证】 onchange机制:不需要保存数据到数据库就可以实时更新用户界面上的显示。 @api.onchange('监听的字段', '监听的字段'。。。) def ...

a631278993的博客 1440

odoo8 onchange方法改变many2one类型字段的domain

onchange方法改变many2one类型字段的domain 首先: in_dept 部门 ---many2one类型 in_post岗位 ---many2one类型 部门中有岗位列表,关系是many2many 'job_ids':fields.many2many('hr.job', 'hr_department_job_rel', 'department_id', 'job_i...

Katherine130的博客 806

odoo之onchange、约束、高级视图

默认值 name = fields.Char(default="Unknown") user_id = fields.Many2one('res.users', default=lambda self: self.env.user) self.env可以是请求的参数或者其他 self.env.cr或self._cr是数据库游标对象,用于查询数据库 self.env.uid是当前用户的

4436

Odoo OnChange 概述

Odoo Model使用@apionchange装饰器将“为字段定义的 onchange后台方法”登记到ModelClass的属性onchangemethods 。在Webclient从后台获取视图定义的时候,将判断字段是否!具备onchange方法,如果有,则在arch里面为字段加上属性onchange=1 。客户端加在视图的时候,从FVG读出视图定义时,将从field读出的onchange=1并转换为fieldonChange=1属性 设置字段值的时候,发出fieldchange事件,收到事件后,交给_

u011115232的博客 613

odoo8使用onchange改变one2many类型的值

因实际业务需求,在主表的栏位变更时,需要重新刷新明细的数据。 使用odoo new api方式来处理此操作时,开始发现明细数据总是无法写入,经过查询相关资料,最后实现成功,现记录如下: class Order(models.Model): name="mymodule.order" line = fields.One2many('mymodule.line',

vnsoft的专栏 5150

Odoo 18 开发手册--onchange

是一个函数,它在模型字段的值变化时被调用。它用于执行某些操作,例如验证数据、计算值、更新其他字段等。

Xodoo开源市场 564

Odoo的只读字段在onchange中被改变时,如何保存到数据库

Readonly field in onchange method If you change the value of a readonly field in onchange method, on save it will not be stored in the database. In order to do that you would need to overridecreate/...

厂长的博客 1226

odoo12 onchange运用

odoo12 onchange弹窗提示 @api.onchange('field_name') def onchange_xxx(self): return { 'warning': { 'title': '提示标题', 'message': '弹窗提示消息文本!!!' } } ...

MALA的博客 454
上一篇: odoo shell交互和调试
下一篇: odoo中使用domain基础操作
StackSurfer
博客等级 码龄3年 685粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值