视图结构
视图的基本结构(大写表示占位符)。
<record id="MODEL_view_TYPE" model="ir.ui.view">
<field name="name">NAME</field>
<field name="model">MODEL</field>
<field name="arch" type="xml">
<VIEW_TYPE>
<VIEW_SPECIFICATIONS/>
</VIEW_TYPE>
</field>
</record>
记录字段
视图对象公开了许多字段。除非另有说明,否则它们是可选的。
name
Char
(必填)
仅在查找某个列表中内容时用作视图的助记符/描述。model
Char
链接到视图的模型。priority
Integer
优先级,由低到高。groups_id
Many2many
->odoo.addons.base.models.res_users.Groups
允许访问当前视图的用户组。arch
Text
视图的布局代码。
视图属性
不同的视图类型具有多种属性,允许自定义常规行为。这里将说明一些主要属性。它们并不是对所有视图类型都有影响。
当前上下文和用户访问权限也可能会影响视图功能。
create
是否允许创建记录。edit
(form
&list
&gantt
)
是否允许编辑记录。delete
(form
&list
)
是否允许删除记录,在“动作”下拉列表中显示删除操作。duplicate
(form
&list
)
是否允许复制记录,在“动作”下拉列表中显示复制操作。decoration-$
(list
&gantt
)
根据指定条件显示记录样式,例如设置不同的状态颜色。
<tree decoration-info="state == 'draft'"
decoration-danger="state == 'help_needed'"
decoration-bf="state='busy'">
<TREE_VIEW_CONTENT>
</tree>
banner_route
获取指定路由地址的json数据(控制器返回json数据需包含html字段,作为结果代码)。
如果html包含样式表<link>
标记,它将被删除并附加到<head>
中。
要与后端交互,您可以使用<a type="action">
标记。有关更多详细信息,请查看AbstractController的_onActionClicked方法的文档(addons/web/static/src/js/views/abstract_controller.js)。
只有扩展AbstractView和AbstractController的视图才能使用此属性,例如Form,Kanban,List,…
例:
<tree banner_route="/module_name/hello" />
class MyController(odoo.http.Controller):
@http.route('/module_name/hello', auth='user', type='json')
def hello(self):
return {
'html': """
<div>
<link href="/module_name/static/src/css/banner.css"
rel="stylesheet">
<h1>hello, world</h1>
</div> """
}
视图继承
继承字段
inherit_id
Many2one
指定父视图ID。mode
Selection
:extension
/primary
如果设置了inherit_id
,默认继承模式为extension
,否则为primary
。
查看匹配
- 如通过
(model,type)
请求视图,具有相应模型和类型的视图、mode=primary
及最优先级值最小的会进行匹配。 - 在通过 id请求视图时,如其模式不是
primary
,会匹配具有primary
模式的最近的父级。
视图解析
解析为所请求/匹配的primary
视图生成最终的arch
:
- 若视图存在父级,会完全解析父级,然后应用当前视图的详细参数。
- 若视图没有父级,会按原内容使用
arch
。 - 会查询当前视图带有
extension
模式的子视图并且它们的继承参数会按照深度优先的原则进行应用(先应用子视图,接着是它的子视图及兄弟视图)。
应用子视图的结果会产生最终的arch
。
继承详情
继承详情由元素定位符所组成,来匹配父级视图中所继承的元素及用于修改所继承元素的子级元素。
有三类用于匹配目录元素的元素定位符:
- 带有
expr
属性的xpath元素。expr
是一个应用于当前arch
的XPath
表达式2 ,它所找到的第一个节点就是匹配内容。- 带有
name
属性的field
元素,匹配带有相同name
的第一个field
。所有其它元素在匹配过程中会进行忽略。- 匹配第一个元素具有相同名称和属性的任意其它元素 (忽略
position
和version
属性)。
继承详情可有一个可选的position
属性,指定如何修改所匹配的节点:
inside
(默认)
继承详情的内容添加到所匹配的节点中replace
继承详情的内容替换掉所匹配的节点。详情内容中仅包含 $0 的文本节点会由一个完整的所匹配节点进行替换,有效的封装所匹配节点。after
继承详情的内容添加到所匹配节点的父级中,在所匹配节点之后before
继承详情的内容添加到所匹配节点的父级中匹配节点之前attributes
继承详情的内容应为带有name属性可可选内容体的attribute
元素:- 如果
attribute
元素拥有内容体,会使用attribute
元素的文本作为值在匹配节点上按照name
名称新建一个属性 - 若
attribute
元素没有内容体,以name
命名的属性名会从匹配节点中删除。如果不存在这种属性,会抛出错误
- 如果
此外,position
move
可用于带有inside
,replace
,after
的直接子视图,或是before
position
属性用于移动节点。