当前位置: 首页 > news >正文

Odoo|“视图”和“模型”之间的数据传输

01前言

今天带领大家学习Odoo系统中“视图”与“模型”之间的数据传输。看题目我们可以知道,这篇文章是面向的是Odoo的初学者。Odoo作为当前最普遍的二开ERP系统,其开源,模块化,灵活开发的属性使得它在ERP相关领域十分受青睐。

Odoo系统是一个现代化的商业应用ERP组件,使用的是Python语言开发。它的开发过程都是模块化的。是典型的模型-视图-控制器(MVC)结构。那么,今天就让我们来探究一下Odoo系统中最主要的Model和View层之间数据是如何传输的。

02详细介绍

首先,我们应该知道Odoo的View层是使用xml格式来编写的。因为Odoo它本身就是一个低代码的平台,当我们按照Odoo的xml编写规范来对View视图进行页面布局时,在Odoo内部的编译就会将xml文件转换成Html的形式。所以当我们把视图呈现给用户的时候,根本就不需要困扰xml如何去解析哦!

接下来我们来看一下Odoo的目录结构:

img

模块的文件夹列表及对应作用:

  • data/演示和实际数据的m
  • models/模型定义,实体类。
  • control1ers/包含控制器
  • views./包含视图和模板
  • static/包含页面相关的,一般划分为css/,/js,/img
  • 其他可选的文件夹:
  • wizard./放临时的model和视图
  • report/存放报表相关的python对象和xml
  • tests/存放python和yml测试用例

实际上Odoo的用户视图界面、安全规则、权限配置等数据都是储存在特殊的数据表中的。然后当我们在模块中编写xml、csv等文件时,并不是在Odoo运行时使用,而是在Odoo运行前,把我们定义好的那些视图、规则等全部加载到对应的数据库表中。所以我们每次改动之后,都需要在Odoo菜单页点击“升级”之后才能把我们的修改呈现出来。

**/****/**View层

说到View层,那么如何在xml文件中定义我们想要的视图呢?

按照Odoo的格式,在xml数据文件里必须以为顶级元素,就像用元素定义网页一样。然后可以有多个元素来记录数据。

一个元素里有2个必要的属性:

  • Model:关联的模型类
  • id:数据的外部id和多个用来绑定字段的元素。

说到元素,它可是我们最常用的元素呢!我们可以使用元素的name属性来绑定Model中的某一个字段。然后根据字段的类型来进行不同样式的显示。比如char类型的文本框,Many-to-one类型的下拉框等等。

除此之外,元素还有很多常见的属性:

  • String:标签文本。这里的定义是可以重写Model层中已经定义的文本的
  • Help:帮助文档。当鼠标选停的时候可以会显示此文本
  • Placeholder:创建时输入框中默认显示的内容(数据库中没有)
  • Widget:窗口显示的控件
  • Options:json形式的可选参数。用来给窗口传递参数
  • Class:CSS样式
  • Invisible:字段是否可见(true:不可见,false:可见)
  • Readonly:只读模式
  • Required:必填项
  • Password:输入类型变成密码格式显示

另外在xml视图中还有很多Odoo特有的表达式和规则。

  • domain表达式:它是用来过滤数据记录的表达式,它的本质是通过Odoo的ORM模型把表达式的值转换为sql的where子句。例如:domain="[(‘id’,‘=’,‘1’ )]"相当于where id = 1;
  • label元素:它通常用来控制字段在视图中的显示。
  • Context:用于传递的上下文数据。
  • 关系字段:options={‘no_open’: True, ‘no_create’ : True},这个是把Odoo默认的表单操作按钮隐藏的属性。这个也很常用呢。

当我们编写完一个xml视图的时候,首先需要在*mainfest.py*清单文件中进行声明,在这里会根据“depends”声明本模块所需要用到的其他模块、根据“data”声明本模块需要被加载处理的xml文件。

img

然后我们需要添加菜单列表,通过菜单的下拉框来跳转到自己的视图之中。菜单选项被存储在menu.xml文件中。

img

但是仅仅添加菜单列表是不能实现跳转动作的,还需要添加窗口动作。

窗口动作通常与菜单和按钮结合在一起。用于返回一个被调度的窗口。还可以通过context来传递上下文信息。一般窗口动作的格式如下所示。

img

● Name:在视图层显示的窗口动作的名称。

● Res_Model:这个动作需要调用的模型。

● View_mode:视图显示模式。

● Res_id:这个窗口的外部id。

● Type:窗口命令的类型。

**/****/**Model层

在前面讲View层的时候可以知道,每个视图的元素都有一个必要的属性Model属性。它是用来绑定Model层的。由于Odoo自身有封装好的持久层框架,所以我们基本上不需要对持久化数据有过多的关注。

在模型类中可以添加附加的属性来给模型增加很多Odoo特有的属性。如下是常用的模型类属性:

  • **_name:**这是用来标记新创建的模型类的字符。一般用来被绑定使用。
  • **_description:**这是用于描述当前的模型类的属性。没有特别的作用。
  • **_rec_name:**在关联的模型类中,用来描述这个模型的字段。一般用于显示many2one类型的标识字段。
  • **_table:**Odoo会在指定数据库生成相关的数据表。默认是通过把.改成_来作为数据库名创建表。
  • **_inherit:**用来表示继承。父模型和子模型直接的继承。

Odoo的模型的概念就像大家熟悉的实体类Entity一样,但是又比其更方便,容易上手一些。但是Model类的本质还是Python类,所以不要忘记在*init.py*文件下加入,让它变成一个包文件哦。

Odoo的所有实体类在被加载的时候都是被存放在缓存中的一个存储块中,Odoo称它为中心注册处。在这里,通过模型类的name保存着所有与这个Odoo模型类有直接的联系的数据。所以我们可以使用self.env[‘x’]来获取这个模型类x。可以使用self.env[‘x’].def来调用这个模型类中的def方法。

一般的Model模型有着如下结构:

img

  • Char : 字符型,size属性定义长度

  • Text :文本型,没有长度限制

  • Selection :下拉框。

  • Date :短日期,年月日,在vies层通过日历选择框显示。

  • Datetime :时间戳

  • Boolean : 布尔类型

  • Binary :二进制数据,在视图层显示为一个文件上传按钮,可以把图片,音频,视频,文档以二进制形式保存。

  • Many-to-one :是多对一关系,表示一个字段的扩展表,它常用的属性有

    -comodel :关联的其他模型名称;

    -string :字符串名称;

    -context : 是一个字典,表示在视图层传递信息。通 常可以用来设置默认值;

    -domain :domain规则进行过滤。

新添加的模型还有一项必不可少的步骤,那就是配置加载权限。Odoo使用的是csv文件,通过把csv文件里的列表数据加载到*“ir.model.access”*模型中实现。所以通常把这也的csv文件名称定义为“ir.model.access.csv”。

img

03总结

通俗来讲设计一个用户视图,就是使用xml文件来把Odoo中的UI设计从数据库中拉出来按照自定义的规则来显示给用户。一个xml视图绑定一个主表模型类,然后通过元素的name属性来绑定模型类中的字段。这个字段通过Odoo的持久层框架又绑定到数据表中的字段,就这样相互的作用。前面也说过,视图只是一种呈现,所以,我们其实可以自己定义方法来对模型中的数据进行处理,甚至可以直接手写模型的数据。究竟如何呈现就要看程序员小哥哥的创造性了。

所以分析到现在,你搞懂Odoo的View层和Model层直接的数据传输了吗?

相关文章:

Odoo|“视图”和“模型”之间的数据传输

01前言 今天带领大家学习Odoo系统中“视图”与“模型”之间的数据传输。看题目我们可以知道,这篇文章是面向的是Odoo的初学者。Odoo作为当前最普遍的二开ERP系统,其开源,模块化,灵活开发的属性使得它在ERP相关领域十分受青睐。 …...

Electron进程通信的另一种方式

上一篇讲述了主进程和渲染进程之间的通信,其中是通过调用 ipcMain 和 ipcRenderer 来完成的。比如渲染进程给主进程发送一个消息,然后主进程再返回一个消息给渲染进程: 主进程的逻辑: ipcMain.on(selectDate,(e,date)>{conso…...

二次型的相关理解

...

Spring框架中用于注入构造函数参数的标签constructor-arg

一、constructor-arg的介绍 constructor-arg是Spring框架中用于注入构造函数参数的标签,它可以用于实现依赖注入的方式之一。在实际开发中,我们通常会在Spring配置文件中声明bean的时候使用constructor-arg标签注入构造函数参数。 constructor-arg标签有…...

spdlog简单介绍和使用

spdlog 是一个C的快速、可扩展的日志库,具有高性能和友好的接口。它支持多种日志输出目标,如控制台、文件、远程服务器等,并具有强大的日志格式化和异步日志记录功能。 以下是对spdlog的简单介绍和使用示例: 安装 spdlog 你可以…...

分类模型的Top 1和Top 5

分类模型的Top 1和Top 5 flyfish 模型分类的结果指标如下图 acc top1 和 acc top5这两列 关于Top 1和Top 5分两种 top 1 accuracy top 5 accuracy 和 top 1 error rate top 5 error rate 这里将需要评估的分类器称为模型 假如一共要测试N张图像,一共有1000个类…...

LinkdeList集合

1.LinkdeList集合的特点: 1.LinkedList是集合的一个实现类 2.LinkedList内部封装了一个双向链表 3.LinkedList集合的增删快,查询慢 4.线程不安全 2.LinkedList集合的方法 1.添加 1.boolean add(Object element) 将元素附加到链表末尾 2.boolean add(int…...

KaiOS APN配置文件apn.json调试验证方法(无需项目全编)

1、KaiOS 的应用就类似web应用,结合文件夹路径webapp字面意思理解。 2、KaiOS APN配置文件源代码在apn.json, (1)apn.json可以自定义路径,通过配置脚本实现拷贝APN在编译时动态选择路径在机器中生效。 (…...

【qemu逃逸】HWS2017-FastCP

前言 虚拟机用户名:root 虚拟机密码:无密码 本题有符号,所以对于设备定位啥的就不多说了,直接逆向设备吧。 设备逆向 在 realize 函数中设置一个时钟任务,并且可以看到只注册了 mmio,大小为 0x100000。…...

调节扬声器和麦克风的音量

const audioSrc require("./../../src/assets/music.mp3")// 调节扬声器音量switchYSQColumn(){//使用Audio对象创建一个新的音频元素const audioElement new Audio();//将音频元素的src属性设置为音频文件的urlaudioElement.src audioSrc;audioElement.play()//创…...

XShelll-修改快捷键-xftp-修改编辑器

文章目录 1.XShelll-修改快捷键2.Xftp-修改文本编辑器3.总结 1.XShelll-修改快捷键 工具>选项 鼠标键盘,右键编辑,新建快捷键。 复制粘贴改成shiftc,shiftv。更习惯一些。 2.Xftp-修改文本编辑器 xftp修改服务器文件默认的编辑器,是记…...

编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)

一.首符号集(First()) 技巧:找最左边可能出现的终结符 例: 1.First(E) E->T,最左边为T,又因为T->F,最左边为F,F->(E)|i,则最左边为{(,i } 2.First(T):只需要看符号串最左…...

远程仓库地址改变后更换url

请按照以下步骤进行操作: 打开终端或命令提示符,并导航到你的本地仓库目录。运行以下命令,查看当前的远程仓库配置:git remote -v 这将显示当前的远程仓库地址。 如果远程仓库地址显示为192.168.1.178,请使用以下命…...

VR全景如何助力乡村振兴,乡村发展在哪些方面用到VR全景技术

引言: 乡村振兴是当今中国发展的重要战略,也是推动农村经济社会全面发展的关键举措。在这一过程中,虚拟现实(VR)全景技术正逐渐崭露头角,为乡村振兴提供了机遇。 一.VR全景技术的概念和应用 1…...

21.6 Python 构建ARP中间人数据包

ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改,从而使得目标主机将网络流量发送到攻…...

DVWA靶场SQL注入

本次注入的是DVWA靶场的SQL injection 1.判断是字符型注入还是数字型注入,构造SQL语句 1 and 12 由此可以判断出为字符型注入 2.考虑闭合方式,先随便丢一个单引号试试看看报错提示 You have an error in your SQL syntax; check the manual that cor…...

AD教程 (九)导线及NetLabel的添加

AD教程 (九)导线及NetLabel的添加 添加导线 绘制导线 点击放置,选择线,或者直接CtrlW快速绘制注意要与绘图工具中的线区别开来,导线是具有电气属性的,绘图工具中的线没有电气属性,只是辅助线绘制导线过程…...

Rust函数进阶

文章目录 函数函数中的函数lambda表达式函数作为参数 Rust系列:初步⚙所有权⚙结构体和枚举类 函数 先来回顾一下Rust中函数的创建过程,在Rust中,函数用fn声明,如有传入参数或返回值,都需要声明数据类型,…...

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …...

Deepin安装英特尔AX200 Wifi驱动

谁支持我的 Linux* 驱动程序? Linux 驱动程序是上游 Linux* 内核的一部分。它们通过常规渠道、分发,或 Linux* 内核档案 提供。我们仅支持作为内核版本中一部分的驱动程序的使用。请参阅下表以了解 iwlwifi 驱动程序支持的设备的列表。 在 英特尔 Wi-Fi…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...