> 文档中心 > odoo 视图继承

odoo 视图继承

odoo 视图继承

表单,列表和搜索视图是使用arch XML结构定义的,要扩展视图,我们需要一种方法来修改这个XML。这意味着需要定位XML中的元素位置,然后在这些位置引入修改。

对于XML,在其中定位元素的最好方法是使用XPath表达式,如果XPath表达式匹配到多个元素,只有第一个元素会被修改。

因此,表达式应该使用独特的属性以使其指定尽可能具体,使用name属性是确保我们找到扩展点的确切xml元素的最简单方法。 因此,在我们的视图XML元素上定义name属性是很重要的。
Xpath表达式的格式:expr=“//标签名[@属性]=‘属性值’” 意思是:找到 属性=属性值 的标签的位置。

下面是一个写在arch中的实现在is_done字段之前添加date_deadline字段的具体例子:

<xpath expr="//field[@name]='is_done'" position="before"> //expr属性值的意思是:找到<filed name="is_done"/>的标签<field name="date_deadline" /></xpath> 

Odoo为此提供了快捷符号,因此大多数时候我们可以完全避免XPath语法。 我们仅使用要定位的元素的特定属性及定位类型相关信息就可以了。

 <field name="is_done" position="before">      <field name="date_deadline" />  </field> 

【如果字段在同一视图中多次出现,则应始终使用XPath语法。】

position属性是可选的:

after:将内容添加到父元素之中,匹配的节点之后。before:添加内容在匹配节点之前。inside(默认值):匹配节点内的追加内容。replace:替换匹配的节点。如果使用空内容,它将删除该匹配的元素。attributes:修改匹配元素的XML属性。在元素内容使用<attribute name =“attr-name”>实现给标签设置新属性值attr-name。
1.如果<attribute></attribute>之间有值,就在匹配的节点上添加以name命名的、以内容主体为值的属性或是修改原同名属性值。2.如果<attribute></attribute>没有值,就将匹配节点上名字为name的属性删除,如果原节点上没有对应的属性,抛出一个错误。

下面是视图继承的模版写法:
1)扩展表单视图

<record id="view_form_模块名_inherited" model="ir.ui.view"><field name="name">模块名_extension</field><field name="model">模型名</field><field name="inherit_id" ref="模块_模型.被继承的form表单id"/><field name="arch" type="xml"> //在arch中进行扩展操作:定位—>插入/修改    <field name="定位标签name" position="在标签的哪里进行扩展"> <field ......> //扩展内容    </field></field></record> 

2)扩展列表视图

   <record id="view_tree_模型名_inherited" model="ir.ui.view"><field name="name">模型名 extension</field><field name="model">模型</field><field name="inherit_id" ref="被继承的tree视图id"/><field name="arch" type="xml">//在arch中进行扩展     <field name="定位标签name" position="扩展位置">   <field ....进行扩展 />     </field></field>    </record>

3)扩展搜索视图

  <record id="view_filter_模型名_inherited" model="ir.ui.view"><field name="name">xxxextension</field><field name="model">模型名</field><field name="inherit_id" ref="被继承的搜索视图id"/><field name="arch" type="xml"> //下面进行定位、扩展举例    <field name="定位的标签name" position="after"> //引入的修改,可以是增加过滤field,也可以定义 filter    </field> </field>    </record>