Odoo开发视图继承

Posted by Ethan on 2019-08-24

视图继承

在odoo中,表单、列表和搜索视图是使用arch XML结构定义的。
如果要通过继承扩展原有视图,我们需要用一种方法来修改这个XML。这需要通过两步来实现。
1、定位到视图XML中某个界面元素的位置;
2、然后在这个位置插入增补定义的视图。通过这两步就可以达到扩展视图的目的。
继承视图正可以实现这个功能。一个继承视图声明如下:

1
2
3
4
5
6
7
8
<record id="view_training_book_copy_form" model="ir.ui.view">
<field name="name">training.book.copy.form</field>
<field name="model">training.book.copy</field>
<field name="mode">primary</field>
<field name="inherit_id" ref="view_training_book_form"/>
<field name="arch" type="xml">
</field>
</record>
  • inherit_id字段使用特定属性ref引用一个外部标识符来指定要被扩展的视图。
  • 对于XML,在其中定位元素的最好方法是使用XPath表达式。
    比如其中一个XPath表达式是//field[@name='author'],这个表达式就是用于定位<field name ="author">元素的。
    这个表达式查找name属性等于author的任意<field>元素。
  • 有关XPath的详细信息,请访问Xpath表达式
  • 如果XPath表达式匹配到多个元素,只有第一个元素会被修改。因此,表达式应该使用独特的属性以使其指定尽可能具体。
  • 使用name属性是确保我们找到扩展点的确切xml元素的最简单方法。
  • 扩展点定位后,可以修改它或在其附近添加XML元素。
    下面是一个写在arch中的实现在author字段之前添加book_id,name,reference,book_rented四个字段的具体例子:
1
2
3
4
5
6
<xpath expr="//field[@name='author']" position="before">
<field name="book_id"/>
<field name="name"/>
<field name="reference"/>
<field name="book_rented"/>
</xpath>

如果只添加一个字段,下面两种方法实现的效果一样:

1
2
3
<field name="author" position="before">
<field name="book_id"/>
</field>
1
2
3
<xpath expr="//field[@name='author']" position="before">
<field name="book_id"/>
</xpath>

通常,我们是在现有字段旁边添加新字段,因此<field>标记经常用作定位器。但是也可以使用任何其他标签:如<sheet><group><page>等。
与定位器元素一起使用的position属性是可选的,并且可以具有以下值:

  • after:将内容添加到父元素之中,匹配的节点之后。
  • before:添加内容在匹配节点之前。
  • inside(默认值):匹配节点内的追加内容。
  • replace:替换匹配的节点。如果使用空内容,它将删除该匹配的元素。从Odoo10开始,它还允许用其他标记包装一个元素,通过在内容中使用$0来表示被替换的元素。
  • attributes:修改匹配元素的XML属性。在元素内容使用<attribute name = "attr-name">实现给属性name设置新属性值attr-name
    例如,在表单中有一个name字段,但它可见不是那么有用,我们可以将它对用户隐藏。
    这可以通过设置invisible属性来完成:
1
2
3
<field name="name" position="attributes">
<attribute name="invisible">1</attribute>
</field>

设置invisible属性来隐藏元素是使用定位器元素replace属性删除节点的一个很好的替代方法。
应该避免删除节点,因为它可能破环那些利用删除的节点作为选择器添加其他元素的依赖模块。