干货 - 全球第一免费开源ERP Odoo模块继承开发技巧

干货 - 全球第一免费开源ERP Odoo模块继承开发技巧

未知 seo及sem资讯 2020年04月10日12时04分03秒

干货|第一个免费的开源ERP Odoo模块继承了开发功能

前言

Odoo的强大功能是您可以添加功能而无需直接修改基础对象。这是通过其继承机制实现的,该机制是通过修改现有对象上的图层来实现的。可以在模型层,视图层和业务逻辑层的不同层上进行此修改。我们创建新模块以进行所需的更改,而不必直接在原始模块中进行修改。

在上一篇文章中,我们从头开始创建了一个新应用程序;在本文中,我们学习了如何通过继承现有的核心应用程序或第三方模块来创建新模块。本文的实现将主要涵盖:

扩展原始模型以向现有模型添加功能

修改数据库以继承视图,添加功能或修改数据以修改其他模块创建的数据记录

其他模型继承机制,例如代理继承和混合类

继承用于向应用程序的业务逻辑添加功能的Python方法

继承网络控制器和模板以向网页添加功能

从图书馆申请中学习申请遗产项目

在第3章Odoo 12中,创建了第一个Odoo应用程序。我们已经为书籍应用程序创建了一个入门模块,以查看书籍目录。现在,我们将创建一个library_member模块以扩展图书应用程序,以便图书成员可以借阅图书。它继承了Book模型,并添加了有关是否可以借用该书的标记。此信息将显示在书本形式和目录页面上。

需要添加书籍会员数据的成员资格模板,类似于用于存储个人数据(例如姓名,地址和电子邮件)以及任何特殊字段(例如书籍会员卡)的合作伙伴。最有效的解决方案是代理继承,该继承会自动创建书籍会员记录并包括关联伙伴记录。此方案使成员中的所有合作伙伴字段可用,而无需任何数据结构重复。

我们还希望以借入形式提供员工和社会职能,包括计划中的行动组成部分,以促进更好的协作。我们还将增加成员从图书馆借书的能力,但这不涉及。以下是当前正在修改的内容的摘要:

书本

添加可用字段?现在手动管理,稍后将自动进行

扩展ISBN验证逻辑以一次支持10位ISBN

展开“书籍目录”页面以识别未借用的图书,并允许用户过滤借用的图书

会员

添加新模板以存储联系信息,例如姓名,卡号和电子邮件,地址

添加社交讨论和计划活动

首先,在library_app文件夹中创建一个folder_member文件夹作为扩展模块,并向其中添加两个文件,一个空文件__init__.py和一个__manifest __.Py文件,其中包含以下内容:

{

“名称”:“图书馆会员”,

“ description”:“管理可以借书的人。”,

“ author”:“ Alan Hou”,

“ depends”:[“ library_app”],

“应用程序”:错误,

}

原始模型遗产

第一步是将is_available布尔字段添加到Book模板中。在这里,我们使用经典的本地模型遗产。该字段值可以根据帐面的借书和还款记录自动计算,但是现在我们将首先使用公共字段。要继承现有模型,必须将_inherit属性添加到Python类以指示继承的模型。新类继承了Odoo模型父级的所有功能,只需要声明要在其中进行的更改。使用此模型的修改随处可见。您可以将这一遗产视为对现有模型的参考,而是进行一些更改。

向模型添加字段

使用Python类创建新模型,继承模型还使用Python和Odoo的继承机制,这是_inherit类的属性。此属性标识继承的模型。新类继承了父Odoo模型的所有功能,只需要声明可修改的部分即可。编码指南建议为每个模型创建一个Python文件,因此让我们添加library_member / models / library_book.py文件以继承原始模型。首先,创建__init __。Py文件以导入文件:

1.添加library_member / __ init __。Py文件以导入子目录模型

的。导入模型

2.将代码文件添加到library_members / models / __ init__.py子文件夹中:

的。导入library_book

3.创建一个文件library_member / models / library_book.py来继承library.book模型:

odoo导入字段,模型

上课用书(型号。型号):

_inherit =“ library.book”

is_available = fields.Boolean(“可用?”)

使用_inherit类属性来声明继承的模型。请注意,我们不使用其他类属性,甚至不使用_name。除非要进行更改,否则无需使用这些属性。

?? _名称是型号标识符。如果修改它会怎样?实际上,您可以对其进行修改,这一次它将创建旧模型的副本并成为新模型。这称为原型继承,并将在本文后面进行讨论。

将其视为模型定义的参考,并进行适当的修改。您可以添加字段,修改现有字段,修改属性类属性,甚至包括业务逻辑的方法。需要该模块才能将新的模型字段添加到数据表中。如果一切顺利,则可以通过“设置”菜单查看模型库来查看此字段。技术> <数据结构>型号。

?/ odoo-dev / odoo / odoo-bin -d dev12 -i library_member

修改现有字段

从上面的部分可以看到,将新字段添加到现有模型非常简单。有时修改现有字段非常容易。通过继承模型,您可以修改现有字段,即只需定义要添加或修改的字段属性。

我们将对所创建的library_app模块的Book模板进行两个简单的修改:

在isbn字段中添加一条注释,说明也支持10位ISBN(此功能将在以后实现)

将数据库索引添加到Publisher_id字段以提高搜索效率

编辑文件library_member / models / library_book.py并将以下代码添加到library.book模板中:

上课用书(型号。型号):

...

isbn = fields.Char(帮助=“使用有效的ISBN-13或ISBN-10。”)

Publisher_id = fields.Many2one(索引= True)

这将修改字段的指定属性,并且不修改不涉及的属性。升级模块,输入书籍形式,将鼠标悬停在ISBN字段上,您将看到添加的信息。索引=很难找到真正的修改,可以在“设置”菜单下的字段定义中看到;技术> <数据库结构>型号。

修改视图和数据

模块中的视图和其他数据组件也可以通过继承进行修改。就视图而言,通常需要添加功能。视图的屏幕结构由弧字段中的XML定义。通过定位需要修改的地方,然后说明要做什么,如何在其中添加XML元素,可以继承这些XML数据。对于其余的数据元素,它们表示写入数据库的记录,并且旧模型可以通过写入操作来修改其值。

继承视图

表单,列表和搜索视图由归档XML结构定义。要继承视图,您需要一种修改XML的方法,即找到XML元素然后对其进行修改。从该视图继承的XML记录与普通视图相似,但具有额外的invoke_来引用继承的视图。让我们继承书本视图并添加is_available字段。

首先,您需要找到旧视图的XML ID,并通过“设置”菜单进行验证。技术>用户界面>>意见。书籍表单的XML ID为library_app.view_form_book。接下来,我们需要找到要插入和修改的XML元素。我们在“ ISBN”字段后添加“可用”。通常,我们将元素放置在name属性中,这里字段名称=“ rdquo”; isbn / gt;。

我们添加views / book_view.xml文件以继承合作伙伴视图并添加以下内容:

ltlt; xml版本= 1,0 “ gt;

ltlt; odoo >

ltlt;寄存器ID = view_form_book_extend 型号=“ ir.ui.view gt;

ltlt;字段名称= 名称“ gt;书:添加可用吗?字段 /字段

ltlt;字段名称= 型号 gt; library.book lt; /字段

ltlt;字段名称= heredu_id “ ref = libary_app.view_form_book quot; /

ltlt;字段名称= 拱类型= xml “ gt;

ltlt;字段名称= isbn “位置=“发表 gt;

ltlt;字段名称= is_available /

ltlt; /字段

ltlt; /字段

ltlt; /记录gt;

ltlt; / odoo >

在上面的代码中,我们突出显示了与继承相关的元素。 hereditary_id字段通过属性ref记录到旧视图的外部标识符。我们将在第5章,Odoo 12,导入,导出和模块数据中讨论外部标识的详细信息。视图由XML定义,并存储在归档字段归档中。要继承视图,请首先找到要扩展的节点,然后执行要执行的操作,例如添加XML元素。

定位节点的最简单方法是使用唯一的标识属性,通常是名称。然后添加一个position属性,指出要进行的更改。在此示例中,旧式节点的名称为“ ”。 isbn 元素。修改是在所选元素之后添加一段XML:

ltlt;字段名称= isbn “位置=“发表 gt;

ltlt; -在此处添加更改-

ltlt; /字段

除字符串属性外,任何XML元素和属性都可以用作继承节点。街道属性被翻译成用户使用的语言,因此它们不能用作节点选择器。

在9.0之前的版本中,字符串属性(显示文本)还用作旧式定位器。 9.0之后不再允许。此限制主要来自这些字符串的翻译机制。

一旦将XML节点选择为旧点,您必须指示要执行的旧操作。这是通过位置属性实现的:

内部(默认):在所选节点内添加内容,此节点应为 lt00的容器;组或 ult26 lt;页

下一个:在选定节点之后将内容添加到父节点

之前:将内容添加到父节点之前的选定节点

replace:替换所选节点。如果使用空元素,则将其删除。 Odoo后来允许使用其他标签来包装元素,内容中的$ 0代表被替换的元素。

attribute:修改匹配元素的属性值。内容必须包含一个或多个lt;属性名称= rdquo; attr-name gt;值= lt; /属性>例如, lt;属性名称= rdquo;隐形rdquo gt;真的/属性>没有内容,例如属性名称= rdquo;隐形rdquo / 该属性将从选定元素中删除。

提示:使用位置=“ rdquo;取代rdquo;删除XML元素,但避免这样做。这样做将破坏依赖于已删除节点的其他模块,并添加诸如占位符的元素。另一种方法是使元素不可见。

除了属性位置之外,上述定位符还可与position = rdquo;的子元素组合。移动rdquo。效果是将子节点的目标节点移动到父定位器地址。

Odoo 12中的修改

位置=“ rdquo”;搬家子定位器是Odoo 12中的新功能,而不是以前的版本中的功能

例如:

ltlt;字段名称= field_ cell “位置=“发表 gt;

ltlt;字段名称= 我的领域位置=“移动/

ltlt; /字段

其他类型的视图(例如列表视图和搜索视图)也具有可作为表单视图继承的拱形字段。

在声明文件数据中添加可视文件并更新模块:

使用XPath选择遗留点

有时,可能没有带有唯一值的属性可以用作XML节点选择器。当所选元素不具有名称属性时,例如,可能会发生这种情况。组,lt;垫或页见元素。另外,有多个具有相同name属性的元素。例如,在看板QWeb视图的同一XML模板中,同一字段可能被多次包含。

在这些情况下,我们需要一种更高级的方法来定位要扩展的XML元素。 XPath表达式是在XML中定位元素的自然方法。例如,在上一篇文章中定义的Book的Visual形式中,表达式XPath定位到该字段。名称= rdquo; isbn gt;元素是//字段[@name] = rsquo; isbn 。表达式查找 lt的元素;字段名称属性等于isbn。

上一节视频形式的XPath遗留物是:

ltlt; xpath expr = quot; //字段[@ name =“ isbn”] quot;位置=“发表 gt;

ltlt;字段名称= is_available /

ltlt; / xpath >

有关XPath语法的更多信息,请参见官方Python文档。

如果表达式XPath与多个元素匹配,则仅第一个选择为扩展目录。因此,使用唯一属性,表达式应尽可能准确。 name属性是最容易确保将正确的元素找到为扩展点的位置,因此在创建可视XML元素时添加唯一标识符很重要。

修改资料

普通数据记录与视图不同,因为它们没有XML存档结构,并且不能使用XPath进行扩展。但是您仍然可以通过替换字段值来修改它。

ltlt;记录ID = x rdquo;模型= rdquo; y rdquo; gt;数据加载元素实际上是插入或更新y模型。如果记录x不存在,则创建该记录,否则将更新/上传。其他模块中的记录可通过全局标识符,因此我们可以重写模块中其他模块中写入的数据。

句点是用于分隔模块名称和对象标识符的保留符号,因此请勿在标识符名称中使用句点,而应使用下划线。

例如,我们将用户安全组的名称更改为图书管理员,并相应地更改了注册表library_app.library_group_user。添加library_member / security / library_security.xml并添加以下代码:

ltlt; odoo >

ult !! -修改组名->

ltlt;寄存器ID = library_app.library_group_user quot;型号=“ res.grup “ gt;

ltlt;字段名称= 名称“ gt;图书管理员/字段

ltlt; /记录gt;

ltlt; / odoo >

这里我们使用元素记录>>并仅写入名称字段。将其视为写入所选字段。

提示:使用元素时记录,您可以选择要写入的字段,但这与快捷方式元素无关,例如 l00;菜单项和 lt; act_window 。他们需要提供所有属性,而缺少任何人都会将响应字段设置为零。但是,您可以使用lt;记录>>为最初使用快捷方式创建的字段设置值。

将security / library_security.xml添加到语句数据库中,并更新模块以查看效果。

其他模型继承机制

之前我们介绍了该模型的基本遗产,在官方文档中称为经典遗产。这是最常用的继承方法,最容易想到的是现场继承。获取模型并继承它。自动添加的新功能会添加到现有模型中,而无需创建新模型。

您可以将多个值传递给_herit属性以继承多个育儿模型。通常,这是通过混合类完成的,该类是可以重复使用的通用功能。它也可以单独用作标准模型,也可以作为功能容器,可以随时添加到其他模型中。

例如,当您使用_inherit属性并且还使用_name属性不同于父模型时,新模型将被重用和继承,并带有其自己的数据表和数据。官方文档称其为原型遗留物。下面我们将使用一个模板并创建一个副本。添加新功能后,它们只会添加到新模型中,而不会添加到原始模型中。

还有一个委托继承,与属性_inherits一起使用(请注意s位于末尾)。这使我们可以创建一个包含并继承现有模型的新模型。当新模型创建新记录时,它也会在原始模型中创建并使用多对一字段进行关联。观看新模型的人可以看到原始模型和新模型中的所有字段,但是在后台,这两个模型分别处理各自的数据。

让我们看一下细节。

使用原型继承复制函数

在继承模型时,我们使用_inherit属性;我们创建了一个继承了library.book的类,并添加了一些功能。类别中不使用_name属性,如果未指定,则使用library.book。如果_name属性设置为其他值,则通过复制继承的模型来创建新模型。

在实际开发中,这种继承通常使用抽象混合类,很少直接继承普通模型。实际上,因为它将创建冗余的数据结构。 Odoo还具有延迟继承机制来防止这种数据冗余,因此普通模型通常使用此方法进行继承。

使用捕食者在线性模型中继承

使用延迟继承重用数据库中的数据结构,而无需复制数据。这是通过将一个模型插入另一个模型来实现的。在UML中,这称为复合关系:父类可以不存在子类而存在,并且子类必须具有父类才能存在。

例如,对于用户内核模型,每个记录都包含一个合作伙伴记录,因此包含了合作伙伴中的所有字段以及用户本人的某些字段。

在book项目中,我们要添加一个会员簿模板。会员拥有会员卡,并用它借阅书籍。我们记录卡号并存储个人信息,例如电子邮件和地址。伙伴关系模型已经包含联系方式和地址信息,因此最好重用它而不是创建重复的数据结构。

为成员模型创建一个文件library_member / models / library_member.py并添加以下代码:

odoo导入字段,模型

类成员(模型。模型):

_name =“ library.member”

_description =“图书馆会员”

card_number = fields.Char()

partner_id = fields.Many2one(

“ res.partner”,

代表=正确,

ondelete =“瀑布”,

必填=正确)

通过代理继承,res.partner继承模型被嵌入到library.member中,因此,在创建成员记录时,将自动创建关联的合作伙伴,并通过partner_id字段进行引用。

Odoo 8中的修改

新API中引入了委托= True字段属性。在此之前,代理继承是由模型属性定义的,类似于_inherits = {; res.partner : partner_id }。现在仍然支持该写作,并且官方网站上有相应的介绍,但是委托= True字段属性可以具有相同的效果并且更易于使用。

通过代理机制,嵌套模型的所有字段以及父模型字段都将自动可用。在此示例中,会员卡模型可以使用合作伙伴中的所有字段(例如名称,地址和电子邮件)以及唯一的成员字段(例如卡号)。在后台,合作伙伴字段存储在关联的合作伙伴注册表中,并且没有重复的数据结构。

这与成员模型中不可用的建模方法无关。

代理遗留而不是原型遗留的优点是,您无需在表之间重复数据作为地址。每个需要包含地址的新模型都将伙伴关系模型与代理一起嵌入。如果您在合作伙伴中修改地址字段,则该地址字段将立即在所有嵌入式模型上可用。

提示:代理继承可以用以下组合代替:

父模型中的多对一字段

超过了create()方法来自动创建和设置父记录

您要在父字段中显示的特定字段的关联字段

有时,这比完整的代理遗产更合适。例如,res.com不继承res.partner,而是使用多个字段。

不要忘记在文件library_member / model / __ init__.py中添加:

的。导入library_book

的。导入library_member

要使用我们创建的成员资格模型,请完成以下步骤:

添加安全检查表(ACL)检查表

添加菜单项

添加表单并列出视图

更新清单文件以声明这些新数据文件

读者可以先尝试自己添加它,然后查看下面的详细步骤:

要创建安全性ACL,请创建一个library_member / security / ir.model.access.csv文件并添加以下代码:

id,名称,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

access_member_user,用户访问成员,model_library_member,library_app.library_group_user,1,1,1,0

access_member_manager,成员管理器访问权限,model_library_member,library_app.library_group_manager,1,1,1,1

要添加菜单项,请创建一个library_member / views / library_menu.xml文件并添加以下代码:

ltlt; odoo >

ltlt; act_window id = quot; ago_library_member “

名称= 图书馆会员

res_model = uquot;库成员“

see_mode = uquot; quot;树木,形状/

ltlt; menuitem id = quot; menu_library_member “

以前= quot; ago_library_member “

父= library_app.menu_library uquot; /

ltlt; / odoo >

要添加视图,请创建一个library_member / views / member_view.xml文件并添加以下代码:

ltlt; xml版本= 1,0 “ gt;

ltlt; odoo >

ltlt;寄存器ID = view_form_member “型号=“ ir.ui.view gt;

ltlt;字段名称= 名称“ gt;图书馆会员表格视图 /字段

ltlt;字段名称= 型号 gt; library.member lt; /字段

ltlt;字段名称= 拱类型= xml “ gt;

ltlt;表格

ltlt;组

ltlt;字段名称= 名称“ /

ltlt;字段名称= 电子邮件“ /

ltlt;字段名称= 卡号 /

ltlt; /组>

ltlt; /表格gt;

ltlt; /字段

ltlt; /记录gt;

ltlt;寄存器ID = view_tree_member “型号=“ ir.ui.view gt;

ltlt;字段名称= 名称“ gt;查看图书馆成员名单请参见/字段

ltlt;字段名称= 型号 gt; library.member lt; /字段

ltlt;字段名称= 拱类型= xml “ gt;

ltlt;表格

ltlt;组

ltlt;字段名称= 名称“ /

ltlt;字段名称= 卡号 /

ltlt; /组>

ltlt; /表格gt;

ltlt; /字段

ltlt; /记录gt;

ltlt;寄存器ID = view_tree_member “型号=“ ir.ui.view gt;

ltlt;字段名称= 名称“ gt;查看图书馆成员名单请参见/字段

ltlt;字段名称= 型号 gt; library.member lt; /字段

ltlt;字段名称= 拱类型= xml “ gt;

ltlt;表格

ltlt;组

ltlt;字段名称= 名称“ /

ltlt;字段名称= 卡号 /

ltlt; /组>

ltlt; /表格gt;

ltlt; /字段

ltlt; /记录gt;

ltlt; / odoo >

最后编辑清单文件以声明这三个新文件:

“数据”:[

...

“安全性/ ir.model.access.csv”,

“ views / library_menu.xml”,

“ views / member_view.xml”,

]

如果拼写正确,则可以在模型升级后使用新的模型手册。

?/ odoo-dev / odoo / odoo-bin -d dev12 -u library_member

使用mixin类继承模型

原型继承主要用于支持混合类。混合物是基于模型的抽象模型,抽象(而不是模型。模型)。它在数据库中没有有效的清单,但是为其他可重用(混合)模型提供了功能。 Odoo插件提供了多种组合。 Talk应用程序(邮件模块)提供了两种最常见的方法:

mail.thread在许多文档表单的下方或右侧提供了一个消息面板功能,以及消息和通知连接。这通常会添加到我们自己的模型中,所以让我们一起学习。

模型mail.activity.mixin提供了一个任务计划。

Odoo 11中的修改

邮件模块现在通过mail.activity.mixin抽象模板提供活动任务管理功能。此功能是在Odoo 11中添加的,并且在以前的版本中不可用。

让我们将上述混合添加到成员模型中。社交消息传递与mail.thread邮件模块一起使用。要将其添加到常规模型中,请执行以下操作:

使用邮件模板向插件添加依赖项

让该类继承两个混合类中的mail.thread和mail.activity.mix

将message_follower_ids,message_ids和Activity_id混合字段添加到窗体视图

对于第一个扩展模型,必须在__manifest __.Py文件中添加对邮件的依赖关系。

“ depends”:[“ library_app”,“邮件”],

在第二步中,mixin类的继承由_inherit属性完成。编辑library_member / models / library_member.py并添加以下代码:

类成员(模型。模型):

_name =“ library.member”

_description =“图书馆会员”

_inherit = [“ mail.thread”,“ mail.activity.mixin”]

...

通过添加这些额外的代码行,我们的模型将包含这些混合的所有字段和方法。

在第三步中,将相关字段添加到表单视图,编辑library_member / views / member_view.xml文件,并在表单末尾添加以下代码:

ltlt; odoo >

...

ltlt;表格

...

ult !! -邮件混合字段-

ltlt; div class = quot; oe_chatter gt;

ltlt;字段名称= message_support_idings “小部件= quot; mail_关注者“ /

ltlt;字段名称= activity_ids “小部件= quot; mail_activity “ /

ltlt;字段名称= message_想法“小部件= quot; mail_election /

ltlt; / div

ltlt; /表格gt;

电子邮件模块还为这些字段提供了一些特定的网页组件,这些组件已在上面的代码中使用。升级模块后,成员资格表将如下所示:

有时普通用户只能访问被跟踪的记录。在这些情况下,我们需要添加访问记录规则,以便用户可以看到续集。在此示例中未使用此功能,但可以与[( message_partner_ids rs00 ;, us0026 rsen ;、它。

Python方法的传统

使用Python方法编写的业务逻辑也可以被继承。 Odoo借鉴了Python已经具有的育儿行为的对象继承机制。

作为一个实际示例,我们将继承ISBN书籍的逻辑验证。提案书中只能检查13位ISBN,而旧书只能包含10位ISBN。我们将继承checkisis()方法来控制这种情况。将以下方法添加到文件library_member / models / library_book.py中:

从odoo导入api,字段,模型

上课用书(型号。型号):

...

@ api.multi

def _check_isbn(个体):

self.ensure_one()

isbn = self.isbn.replace(“-”,)

digits = [如果x.isdigit(),则isbn中x的int(x)]

如果len(数字)== 10:

评估者= [1、2、3、4、5、6、7、8、9]

总数=总和(a * b,a,zip中的b(数字[:9],注解者))

支票=总计%11

返回数字[-1] ==检查

否则:

返回()._ check_isbn()

要继承方法,我们必须重新定义该方法。我们可以使用super()来调用实现的部分。通过这种方法,我们检查它是否为10位ISBN,然后输入缺少的验证逻辑。如果不是10位,则输入原始的13位验证逻辑。

如果您想测试甚至编写测试用例,请以0-571-05686-5为例,这本书是William 戈尔丁的苍蝇之王。

Odoo 11中的修改

从Odoo 11开始,支持的主要Python版本是Python 3(Odoo 12中的Python 3.5)。 Odoo的早期版本使用Python 2,其中super()需要两个参数,类名和备忘录。然后,应将以上示例中的代码修改为Book ._ check_isbn()。

Web控制器和模板的遗留物

Odoo中的所有功能都是可扩展的,网络功能也不例外,因此可以继承现有的控制器和模块。

例如,我们将从目录书中继承页面,添加有关我们之前添加的可用书的信息:

在控制器上添加对查询参数的支持,请访问/图书馆/书籍?可用= 1筛选借来的书

在模板一侧,添加指示书不可用的指示

Heritage Web控制器

Web控制器不应包含实际的业务逻辑,而应只关注表示逻辑。我们可能需要增加对其他URL参数的支持,甚至需要路由更改以显示网页。我们将扩展/ library / books以支持available = 1参数,以过滤可用的书。

要继承现有的控制器,必须导入相应的对象,然后使用添加逻辑方法来实现它。添加ibrary_member / controllers / main.py文件并添加以下代码:

从odoo导入http

从odoo.addons.library_app.controllers.main进口的书籍

类BookExtended(书籍):

@ http.route()

def列表(自己,** kwargs):

答案=超过()。准备好了(** kwargs)

如果kwargs.get(“可用”):

图书= http.request.env [“ library.book”]

books = Book.search([(“ is_available”,“ =”,True)])

answer.qcontext [“ books”] =书籍

返回响应

我们要继承的Book Controller设置为library_app / controllers /main.py。这就是为什么需要通过odoo.addons.library_app.controllers.main导入它的原因。这与模型不同,模型可以通过env对象中的中央寄存器引用任何模型类,而不必知道实现该模型的文件。控制器没有这个,我们需要知道实现需要从控制器继承的模块和文件。

然后声明一个基于Books的BooksExtended类,该类名是不相关的,仅用于继承和扩展原始类中定义的方法。

接下来,我们(重新)定义了一个检查方法列表()。它至少需要一个简单的@ http.route()装饰器才能上路。没有参数,将保留父类中定义的路径。但是,您也可以向@ http.route()装饰器添加参数,以重新定义或替换类路由。

在继承的list()方法中,super()最初用于运行现有代码。处理的结果返回带有属性模板的Reply对象,该属性模板将由模块返回,并且上下文qcontext用于呈现。但是,您还需要生成HTML,只有在控制器启动并运行时才会生成HTML。这也使我们能够在最终渲染完成之前修改Response属性。

list()方法采用** kwargs参数,并捕获kwargs词典中的所有参数。这些是URL中的参数,如何? Available =1。该方法以kwargs为单位检测可用键的值,并在检测到后更改qcontext以获得一组仅可用于借阅的账簿记录。

另外,请记住通过将控制器子目录添加到library_member / __ init__.py来通知模块有关此新Python文件的信息:

的。导入模型

的。进口管制员

在文件library_member / controllers / __ init__.py中添加一行代码:

的。进口主要

然后更新模板并访问http:// lt;您的服务器:8069 /图书馆/书籍?可用= 1将仅显示具有可用?已检查

继承QWeb模板

要修改网页的实际显示,您必须继承使用的QWeb模板。我们将继承library_app.book_list_template来显示有关不可用书籍的更多信息。添加library_member / views / book_list_template.xml文件并添加以下代码:

ltlt; odoo >

ltlt;模板ID = book_list_extended “

名称= 扩展图书清单

hered_id = uquot; library_app.book_list_template gt;

ltlt; xpath expr = quot; //跨度[@ t-field =“ book.publisher_id”] quot;位置=“发表 gt;

ltlt; t t-if = “不是book.is_available gt;

ltlt; gt; (不可用) / b>

ltlt; / t

ltlt; / xpath >

ltlt; /模板

ltlt; / odoo >

网页模板是XML文件,就像Odoo的其他视图一样,您也可以使用XPath来定位和操作元素。继承的模型由元素中的hered_id指示。

提示:在前面的示例中,使用了非常灵活的XPath标记,但是在这里也可以使用等效的简化标记:跨度t字段= book.publisher_id 位置=“ rdquo”;发布“ gt;

然后将文件的语句添加到library_member / __清单__。Py文件中:

“数据”:[

...

“视图/book_list_template.xml”,

]

然后访问http:// // 服务器 8069 /图书馆/书籍,以提交有关不可用书籍的其他(不可用)信息。

总结

扩展是Odoo框架的重要功能。我们可以为需要执行功能的多个图层创建插件,以对现有插件进行修改或向其添加功能。

在模型层中,我们使用_inherit模型引用现有模型,然后执行修改。模型中的字段对象还支持重叠定义,这些定义可以重写现有字段并仅修改属性。

其他模型遗留机制允许利用数据结构和业务逻辑。代理继承在多对一关联字段上使用委托= True属性(或旧的遗留模型属性)来使所有关联模块的所有字段均可用,并重用其数据结构。原型继承使用_inherit属性来复制其他模型的功能(数据结构的定义和方法)并实现抽象混合,从而提供一系列可重用的功能,例如文档讨论消息和关注者。

在视图层中,视图结构由XML定义(使用XPath或Odoo简化的syn轴)以定位要继承的XML元素并添加XML片段。该模块创建的其他记录可以由继承模块修改,只需引用相应的完整XML ID并在预测字段上执行写操作。

在业务逻辑层中,可以使用相同的模型继承机制进行继承,并重新定义继承方法。在一个方法中,Python的super()函数可用于调用继承的方法的代码,并在该方法之前或之后添加代码以使其工作。

t对于前端网页,控制器中的展示逻辑继承自包含和方法包含包含网页包含包含XML包含的预测,因此可以像一样转变类型一样。

广告位
标签: