• 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层直接的数据传输了吗?

  • 相关阅读:
    Mojo:新型AI语言中的7个令人惊叹的Python升级,用简单的英语解释人工智能
    有SSL证书的网站更容易收录吗?
    《LKD3粗读笔记》(15)进程地址空间
    Android使用setXfermode例子
    windows系统下如何删除带有两点的文件夹
    如何在vue中使用百度地图添加自定义覆盖物(水波纹)动画效果
    c语言指针的概念
    嵌入式Linux应用开发-第十三章APP怎么读取按键值
    基于JavaWeb+SSM+Vue“鼻护灵”微信小程序系统的设计和实现
    【this指针】
  • 原文地址:https://blog.csdn.net/qq_43337265/article/details/134256135