扩展视图
表单,列表和搜索视图是使用arch XML结构定义的。 要扩展视图,我们需要一种方法来修改这个XML。 这意味着需要定位XML中的元素位置,然后在这些位置引入修改。
继承视图正可以实现这个功能。一个继承视图声明如下:
<record id="view_form_todo_task_inherited" model="ir.ui.view"> <field name="name">Todo Task form - User extension</field> <field name="model">todo.task</field> <field name="inherit_id" ref="todo_app.view_form_todo_task"/> <field name="arch" type="xml"> </field> </record>
inherit_id字段使用特定属性ref引用一个外部标识符来指定要被扩展的视图。 外部标识符将在第4章“模块数据”中更详细地讨论。
对于XML,在其中定位元素的最好方法是使用XPath表达式。 比如,以上一章中定义的表单视图为例,其中一个XPath表达式是// field [@name] ='is_done',这个表达式就是用于定位<field name =“is_done”>元素的。 这个表达式查找name属性等于is_done的任意field元素。 有关XPath的详细信息,请访问https://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support。
如果XPath表达式匹配到多个元素,只有第一个元素会被修改。 因此,表达式应该使用独特的属性以使其指定尽可能具体。 使用name属性是确保我们找到扩展点的确切xml元素的最简单方法。 因此,在我们的视图XML元素上定义name属性是很重要的。
扩展点定位后,您可以修改它或在其附近添加XML元素。 下面是一个写在arch中的实现在is_done字段之前添加date_deadline字段的具体例子:
<xpath expr="//field[@name]='is_done'" position="before"> <field name="date_deadline" /> </xpath>
幸运的是,Odoo为此提供了快捷符号,因此大多数时候我们可以完全避免XPath语法。 代替前面的XPath元素,我们仅使用要定位的元素的特定属性及定位类型相关信息就可以了。前面的XPath,我们可以写成:
<field name="is_done" position="before"> <field name="date_deadline" /> </field>
请注意,如果字段在同一视图中多次出现,则应始终使用XPath语法。 这是因为在字段第一次出现的时候Odoo将停止查找,而这可能会将您的更改应用在错误的字段上。
通常,我们是在现有字段旁边添加新字段,因此<field>标记经常用作定位器。 但是也可以使用任何其他标签:如<sheet>,<group>,注意
在版本9.0之前,string属性(用于显示标签文本)也可以用作扩展定位器。 从9.0开始,这种做法不再允许了。 这个限制与对这些字符串进行操作的语言翻译机制有关。