视图结构

视图的基本结构(大写表示占位符)。

<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
    是否允许创建记录。
  • editformlistgantt
    是否允许编辑记录。
  • deleteformlist
    是否允许删除记录,在“动作”下拉列表中显示删除操作。
  • duplicateformlist
    是否允许复制记录,在“动作”下拉列表中显示复制操作。
  • decoration-$listgantt
    根据指定条件显示记录样式,例如设置不同的状态颜色。
<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 Selectionextension / primary
    如果设置了inherit_id,默认继承模式为extension,否则为primary

查看匹配

  • 如通过(model,type)请求视图,具有相应模型和类型的视图、mode=primary 及最优先级值最小的会进行匹配。
  • 在通过 id请求视图时,如其模式不是primary,会匹配具有primary模式的最近的父级。

视图解析
解析为所请求/匹配的primary视图生成最终的arch

  • 若视图存在父级,会完全解析父级,然后应用当前视图的详细参数。
  • 若视图没有父级,会按原内容使用arch
  • 会查询当前视图带有extension模式的子视图并且它们的继承参数会按照深度优先的原则进行应用(先应用子视图,接着是它的子视图及兄弟视图)。
    应用子视图的结果会产生最终的arch

继承详情
继承详情由元素定位符所组成,来匹配父级视图中所继承的元素及用于修改所继承元素的子级元素。
有三类用于匹配目录元素的元素定位符:

  • 带有expr属性的xpath元素。expr是一个应用于当前archXPath表达式2 ,它所找到的第一个节点就是匹配内容。
  • 带有name属性的field元素,匹配带有相同name的第一个field。所有其它元素在匹配过程中会进行忽略。
  • 匹配第一个元素具有相同名称和属性的任意其它元素 (忽略positionversion属性)。

继承详情可有一个可选的position属性,指定如何修改所匹配的节点:

  • inside(默认)
    继承详情的内容添加到所匹配的节点中
  • replace
    继承详情的内容替换掉所匹配的节点。详情内容中仅包含 $0 的文本节点会由一个完整的所匹配节点进行替换,有效的封装所匹配节点。
  • after
    继承详情的内容添加到所匹配节点的父级中,在所匹配节点之后
  • before
    继承详情的内容添加到所匹配节点的父级中匹配节点之前
  • attributes
    继承详情的内容应为带有name属性可可选内容体的attribute元素:

    • 如果attribute元素拥有内容体,会使用attribute元素的文本作为值在匹配节点上按照name名称新建一个属性
    • attribute元素没有内容体,以name命名的属性名会从匹配节点中删除。如果不存在这种属性,会抛出错误

此外,position move可用于带有insidereplaceafter的直接子视图,或是before position属性用于移动节点。

 

参考文档

Odoo13官方开发文档:视图
Odoo13开发者文档:视图