html5在线制作网站模板,网站seo收录工具,东港建站公司,网页微信客户端手机版一#xff1a;继承 在不改变底层对象的时候添加新的功能——这是通过继承机制来实现的#xff0c;作为在现有对象之上的修改层#xff0c;这些修改可以发生在所有级别#xff1a;模型#xff0c;视图和业务逻辑。不是直接修改现有模块#xff0c;而是创建一个新模块以添加…一继承 在不改变底层对象的时候添加新的功能——这是通过继承机制来实现的作为在现有对象之上的修改层这些修改可以发生在所有级别模型视图和业务逻辑。不是直接修改现有模块而是创建一个新模块以添加预期的修改。 1扩展模型 Odoo 模型存在 Python 的模块之外, 在中间注册表那里。对于这个注册表可以通过模型的方法使用self.env[model name]进入。 例如, 通过res.partner 模型获取对象的引用 代码书写如下 self.env[res.partner]。 添加字段 # -*- coding: utf-8 -*-
from odoo import models, fields, api
class Sub(models.Model):
_inherit Root //通过_inherit属性来继承父模型
newColfields.XX.... //在下面添加新字段即可。 修改现有字段 为了改变现有字段的属性只需再次定义该字段需要修改的属性显式重写即可会保留未修改的所有其他未在此处明确使用的字段的属性。 添加方法 添加新方法很简单只需在继承类中声明新的函数。 修改方法 扩展或更改现有逻辑可以通过声明具有完全相同名称的方法来覆盖相应的方法。 新方法将替换前一个方法它可以只是扩展继承类的代码使用Python的super方法来调用父方法。然后可以在调用super方法之前和之后在原有逻辑周围添加新逻辑。 扩展模型的几种方式 1类继承扩展类中没有_name属性因为它继承了父类的_name。对现有模型的扩展 添加新功能都将添加到现有模型中不会创建新模型。 因此在odoo中根据_name唯一确定这个模型时找到的就是扩展后的类。如上面添加字段是类继承 2原型继承我们想使用具有不同于父模型的值的_name属性我们将获得一个新模型重用来自继承的特性但是具有自己的数据库表和数据。其实就是把继承的类的功能特性拷贝衣服给新的模型使用并不改变被继承模型。 复制意味着被继承的方法和字段也将在继承模型中可用。 对于字段这意味着它们也将被创建并存储在目标模型的数据库表中。 原始继承和新继承模型的数据记录保持不相关。 只有定义是共享的。 3代理继承委托继承使用_inherits属性它允许一个模型以透明的方式包含其他模型。通过字典映射继承模型与字段的关系并关联它们。相当于成员变量引用一个外部的类对象赋值给这个模型的一个成员但是对象的值是保存在被引用的类的数据库表中的。但是在当前类通过成员修改了变量值的则会同步到被引用的类的数据库表中 优点是不需要在几个表之间重复数据结构例如地址。 任何需要包含地址的新模型都可以将其委派给嵌入式合作伙伴模型。 如果在合作伙伴地址字段中引入了修改则这些修改会立即提供给嵌入它的所有模型 2扩展视图 表单列表和搜索视图是使用arch XML结构定义的。 要扩展视图我们需要一种方法来修改这个XML。 这意味着需要定位XML中的元素位置然后在这些位置引入修改。 对于XML在其中定位元素的最好方法是使用XPath表达式。如果XPath表达式匹配到多个元素只有第一个元素会被修改。 因此表达式应该使用独特的属性以使其指定尽可能具体。 使用name属性是确保我们找到扩展点的确切xml元素的最简单方法。 因此在我们的视图XML元素上定义name属性是很重要的。 Xpath表达式的格式expr//标签名[属性]属性值找到属性属性值的标签位置。 下面是一个写在arch中的实现在is_done字段之前添加date_deadline字段的具体例子 xpath expr//field[name]is_done positionbefore //expr属性值的意思是找到filed nameis_done/的标签field namedate_deadline /
/xpath Odoo为此提供了快捷符号因此大多数时候我们可以完全避免XPath语法。 我们仅使用要定位的元素的特定属性及定位类型相关信息就可以了。 field nameis_done positionbeforefield namedate_deadline //field 如果字段在同一视图中多次出现则应始终使用XPath语法。 position属性是可选的 after:将内容添加到父元素之中匹配的节点之后。
before:添加内容在匹配节点之前。
inside默认值:匹配节点内的追加内容。
replace:替换匹配的节点。如果使用空内容它将删除该匹配的元素。
attributes修改匹配元素的XML属性。在元素内容使用attribute name “attr-name”实现给属性name设置新属性值attr-name。 1扩展表单视图 record idview_form_模块名_inherited modelir.ui.viewfield namename模块名_extension/fieldfield namemodel模块.数据模型/fieldfield nameinherit_id ref模块_模型.被继承的form表单name属性/field namearch typexml //在arch中进行扩展操作定位—插入/修改field name定位标签位置 position在标签的哪里进行扩展field ...... //扩展内容/field/field
/record 2扩展列表视图 record idview_tree_模型名_inherited modelir.ui.viewfield namename模型名 extension/fieldfield namemodel模块.模型/fieldfield nameinherit_id ref被继承的tree视图name名/field namearch typexml//在arch中进行扩展field name定位标签名 position扩展位置 field ....进行扩展 //field/field/record 3扩展搜索视图 record idview_filter_模型名_inherited modelir.ui.viewfield namename extension/fieldfield namemodel模型名/fieldfield nameinherit_id ref被继承的filter视图名/field namearch typexml //下面进行定位、扩展举例field namename positionafterfilter namefilter_my_tasks stringMy Tasks domain[(user_id,in,[uid,False])] //field /field/record 4修改记录 对于记录 record idx modely 数据记录加载时实际上对模型y执行了create或update操作︰ 如果记录x不存在则创建它; 否则更新原来对应的值。 修改菜单项 — — 修改菜单项--
record id菜单视图id modelir.ui.menu//进行修改
/record 修改action_window record modelir.actions.act_windowidaction菜单id//进行修改
/record 二模块数据 1列表数据的导出 数据导出是tree视图的标准功能不涉及编码。 只需在列表视图左侧复选框勾选需要导出的记录然后点击列表上方“动作”下拉列表选择“导出”。 在导出对话框中选择需要导出的列、导出的格式一般选择CSV勾选 导入兼容导出然后点击“导出到文件”即可。 2导入数据 在面板点击“导入”按钮选择文件后载入。然后点击“验证”检查文件内容的格式合法性如果正常则点击“导入”即可。 3模块数据 模块使用数据文件将其配置加载到数据库可以通过CSV和XML文件完成。为了完整性也可以使用YAML文件格式但是它很少用于加载数据。 一个附加的限制是文件名必须与要加载数据的模型的名称匹配这样系统才可以推断应该将数据导入相应的模型。 数据CSV文件的常见用法是加载到ir.model.access模型中的安全定义。 4演示数据 一个模块在安装时尽量事先定义一些演示数据方便在安装后进行测试使用。 演示数据我们放在data目录下命名为 xx.xx.csv或者xx.xx.xml 然后在manifest文件中的data属性进行配置。 5XML noupdate:重复数据加载时将重写上次运行中加载的记录。 这意味着升级一个模块将覆盖在数据库内可能已经进行的任何手动更改。此重新导入行为是默认值但可以更改以便在升级模块时某些数据文件记录保持不变。 这是通过odoo或元素的noupdate “1”属性完成的。 这些记录将在安装addon模块时创建但在后续模块升级中不会对其进行任何操作。 XML中定义记录 每个record元素有两个基本属性id和model并且包含为每列分配值的field元素。如前所述id属性对应于记录的外部标识符并且模型属性对应于要写入记录的目标模型。 设置字段值的几种方式如下 1record元素定义数据记录并包含field元素以设置每个字段的值field元素的name属性标识要写入的字段要写入的值是元素内容字段的开始和结束标记之间的文本。 2定义字段值的更精细的替代方法是eval属性它评估一个Python表达式并将结果值分配给字段。 field namedate_deadlineeval(datetime.now() timedelta(-1)).strftime(%Y-%m-%d) / 3field元素还有一个ref属性用于使用外部标识符设置many-to-one字段的值。 field nameuser_id refbase.user_demo / XML中触发函数 可以通过function元素在其加载过程中执行方法。这可以用来建立演示和测试数据。 functionmodel数据模型name数据模型中的方法eval参数 / 另一方式是触发工作流 workflow model模型
ref工作流实例
action工作流信号触发工作流 / 转载于:https://www.cnblogs.com/soleZ/p/10076040.html