扩展视图之xpath用法

在视图扩展中,需要定位扩展字段需要显示的位置,通过xpath来实现定位

odoo 视图函数 在整个项目文件中,结构并不是十分明显,虽然它也遵循MVC设计,类比django的MTV模式,各个模块区分的十分明显,在Odoo中,视图的概念不是特别明显,很多时候,我们会将调用模型的函数直接写在models里边(即:类中)。

而对于模版Tempelate部分,odoo里边反而称做“views”,如下是odoo典型模块,销售模块sale的代码结构:

可以看到odoo的前端显示部分,对应的就是views,它是基于xml来实现的,而不是我们日常的html;

今天要说的xpath语法,就是针对于xml文件的一种语法格式。

通过xpath语法,可以对xml文件中要显示的内容,进行自定义的显示,比如:我们要插入一个新的标签在当前已经存在的标签的后边,前边,里边甚至替换。。。

这种语法看着还有点像JS的寻找父子节点。。。

1. xpath有一个用法,就是当你要修改的多个标签是在同一个目录节点下的时候,多个xpath标签可以写在同一个<record>标签中,而不用每次都去声明定义一遍,

支持的视图类型:form、tree、search ...支持的定位方法:

<notebook position="inside">       <xpath expr="//page[@name='page_history']" position="inside"> <field name="mobile" position="after"> <filter name="consumable" position="after"> <group name="bank" position="after"> <xpath expr="//field[@name='standard_price']" position="replace"> <xpath expr="//button[@name='open_ui']" position="replace"> <xpath expr="//div[@class='oe_employee_details']/h4/a" position="after"> <xpath expr="/form/sheet/notebook/page/field[@name='line_ids']/tree/field[@name='analytic_account_id']" position="replace"> <xpath expr="/form/sheet/notebook/page/field[@name='line_ids']/form/group/field[@name='analytic_account_id']" position="replace">

支持的规则:before、after、replace、inside、attributes

插入:

position='before'
position="after"

      <field name="mobile" position="after">        <field name="sale_order_count"/>       </field> <filter name="consumable" position="after"> <separator/> <filter name="filter_to_qty_available" string="在手数量>0" icon="terp-accessories-archiver+" domain="[('qty_available', '>', 0)]"/> <filter name="filter_to_virtual_available" string="预测数量>0" icon="terp-accessories-archiver+" domain="[('virtual_available', '>', 0)]"/> </filter>

替换:
position="replace"

               <xpath expr="//field[@name='standard_price']" position="replace"> <group name='cost_prices' colspan="2" col="4"> <field name="standard_price" nolabel="1" attrs="{'readonly':[('cost_method','=','average')]}"/> <field name="cost_price_extra" groups="product.group_product_variant"/> </group> </xpath> <xpath expr="//button[@name='open_ui']" position="replace"> <button name="open_ui" type="object" string="Start Selling" attrs="{'invisible' : [('pos_state', 'not in', ('opened',))]}" class="oe_highlight" invisible="True"/> </xpath>

内部创建:position="inside

               <xpath expr="//page[@name='page_history']" position="inside"> <group name="grp_task" string="Tasks"> <field name="task_ids" colspan="4" nolabel="1"> <tree string="Tasks" editable="bottom"> <field name="name"/> <field name="user_id"/> <field name="date_deadline"/> <field name="state" invisible="1"/> <button name="do_open" states="pending,draft,done,cancelled" string="Start Task" type="object" icon="gtk-media-play" help="For changing to open state" invisible="context.get('set_visible',False)"/> <button name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close" help="For changing to done state"/> </tree> </field> </group> </xpath> 

修改属性:修改属性能够实现的功能,不要使用 replace
position="attributes"
            

<xpath expr="//field[@name='name']" position="attributes"                        

<attribute name="required">1</attribute>

 </xpath1
        <record id="product_normal_variant_form_view" model="ir.ui.view"> <field name="name">product.normal.variant.form</field> <field name="model">product.product</field> <field name="type">form</field> <field name="inherit_id" ref="product.product_normal_form_view" /> <field name="arch" type="xml"> <data> <xpath expr="//field[@name='name']" position="attributes"> <attribute name="required">1</attribute> </xpath> <xpath expr="//field[@name='standard_price']" position="replace"> <group name='cost_prices' colspan="2" col="4"> <field name="standard_price" nolabel="1" attrs="{'readonly':[('cost_method','=','average')]}"/> <field name="cost_price_extra" groups="product.group_product_variant"/> </group> </xpath> <sheet> <group col="2" colspan="2" groups="base.group_extended" position="replace"> <group colspan="2" col="6" name="weight" groups="base.group_extended"> <field name="is_multi_variants" invisible="1"/> <group colspan="2" col="2"> <separator string="Template Weights" colspan="2"/> <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/> </group> <group colspan="2" col="2" attrs="{'invisible':[('is_multi_variants','=',False)]}"> <separator string="Variant Weights" colspan="2"/> <field digits="(14, 3)" name="additional_volume" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="additional_weight" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="additional_weight_net" attrs="{'readonly':[('type','=','service')]}"/> </group> <group colspan="2" col="2" attrs="{'invisible':[('is_multi_variants','=',False)]}"> <separator string="Total Weights" colspan="2"/> <field digits="(14, 3)" name="total_volume"/> <field digits="(14, 3)" name="total_weight"/> <field digits="(14, 3)" name="total_weight_net"/> </group> </group> </group> </sheet> </data> </field> </record> <!-- 隐藏 open_ui 按钮 --> <record model="ir.ui.view" id="pos_session_opening_form_view_openui"> <field name="name">pos.session.opening.form.view.openui</field> <field name="model">pos.session.opening</field> <field name="inherit_id"ref="point_of_sale.pos_session_opening_form_view"/> <field name="arch"type="xml"> <xpath expr="//button[@name='open_ui']"position="replace"> <button name="open_ui"type="object"string="Start Selling"attrs="{'invisible' : [('pos_state', 'not in', ('opened',))]}"class="oe_highlight"invisible="True"/> </xpath> </field> </record> <record id="product_search_form_view_filter"model="ir.ui.view"> <field name="name">product.search.form.filter</field> <field name="model">product.product</field> <field name="inherit_id"ref="product.product_search_form_view"/> <field name="arch"type="xml"> <filter name="consumable"position="after"> <separator/> <filter name="filter_to_qty_available"string="在手数量>0"icon="terp-accessories-archiver+"domain="[('qty_available', '>', 0)]"/> <filter name="filter_to_virtual_available"string="预测数量>0"icon="terp-accessories-archiver+"domain="[('virtual_available', '>', 0)]"/> </filter> </field> </record> <!-- Partner kanban view inherte --> <record model="ir.ui.view"id="crm_lead_partner_kanban_view"> <field name="name">res.partner.kanban.saleorder.inherit</field> <field name="model">res.partner</field> <field name="inherit_id"ref="base.res_partner_kanban_view"/> <field name="priority"eval="20"/> <field name="arch"type="xml"> <field name="mobile"position="after"> <field name="sale_order_count"/> </field> <xpath expr="//div[@class='oe_kanban_partner_links']"position="inside"> <a name="%(sale.act_res_partner_2_sale_order)d"type="action"t-if="record.sale_order_count.value>0"> <t t-esc="record.sale_order_count.value"/> Sales </a> </xpath> </field> </record> <!-- Partners inherited form --> <record id="view_task_partner_info_form"model="ir.ui.view"> <field name="name">res.partner.task.info.inherit</field> <field name="model">res.partner</field> <field name="inherit_id"ref="base.view_partner_form"/> <field name="arch"type="xml"> <xpath expr="//page[@name='page_history']"position="attributes"> <attribute name="invisible">False</attribute> </xpath> <xpath expr="//page[@name='page_history']"position="inside"> <group name="grp_task"string="Tasks"> <field name="task_ids"colspan="4"nolabel="1"> <tree string="Tasks"editable="bottom"> <field name="name"/> <field name="user_id"/> <field name="date_deadline"/> <field name="state"invisible="1"/> <button name="do_open"states="pending,draft,done,cancelled"string="Start Task"type="object"icon="gtk-media-play"help="For changing to open state"invisible="context.get('set_visible',False)"/> <button name="action_close"states="draft,pending,open"string="Done"type="object"icon="terp-dialog-close"help="For changing to done state"/> </tree> </field> </group> </xpath> </field> </record>

支持的视图类型:form、tree、search ...支持的定位方法:

<notebook position="inside">       <xpath expr="//page[@name='page_history']" position="inside"> <field name="mobile" position="after"> <filter name="consumable" position="after"> <group name="bank" position="after"> <xpath expr="//field[@name='standard_price']" position="replace"> <xpath expr="//button[@name='open_ui']" position="replace"> <xpath expr="//div[@class='oe_employee_details']/h4/a" position="after"> <xpath expr="/form/sheet/notebook/page/field[@name='line_ids']/tree/field[@name='analytic_account_id']" position="replace"> <xpath expr="/form/sheet/notebook/page/field[@name='line_ids']/form/group/field[@name='analytic_account_id']" position="replace">

支持的规则:before、after、replace、inside、attributes

插入:

position='before'
position="after"

      <field name="mobile" position="after">        <field name="sale_order_count"/>       </field> <filter name="consumable" position="after"> <separator/> <filter name="filter_to_qty_available" string="在手数量>0" icon="terp-accessories-archiver+" domain="[('qty_available', '>', 0)]"/> <filter name="filter_to_virtual_available" string="预测数量>0" icon="terp-accessories-archiver+" domain="[('virtual_available', '>', 0)]"/> </filter>

替换:
position="replace"

               <xpath expr="//field[@name='standard_price']" position="replace"> <group name='cost_prices' colspan="2" col="4"> <field name="standard_price" nolabel="1" attrs="{'readonly':[('cost_method','=','average')]}"/> <field name="cost_price_extra" groups="product.group_product_variant"/> </group> </xpath> <xpath expr="//button[@name='open_ui']" position="replace"> <button name="open_ui" type="object" string="Start Selling" attrs="{'invisible' : [('pos_state', 'not in', ('opened',))]}" class="oe_highlight" invisible="True"/> </xpath>

内部创建:position="inside

               <xpath expr="//page[@name='page_history']" position="inside"> <group name="grp_task" string="Tasks"> <field name="task_ids" colspan="4" nolabel="1"> <tree string="Tasks" editable="bottom"> <field name="name"/> <field name="user_id"/> <field name="date_deadline"/> <field name="state" invisible="1"/> <button name="do_open" states="pending,draft,done,cancelled" string="Start Task" type="object" icon="gtk-media-play" help="For changing to open state" invisible="context.get('set_visible',False)"/> <button name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close" help="For changing to done state"/> </tree> </field> </group> </xpath> 

修改属性:修改属性能够实现的功能,不要使用 replace
position="attributes"
            

<xpath expr="//field[@name='name']" position="attributes"                        

<attribute name="required">1</attribute>

 </xpath1
        <record id="product_normal_variant_form_view" model="ir.ui.view"> <field name="name">product.normal.variant.form</field> <field name="model">product.product</field> <field name="type">form</field> <field name="inherit_id" ref="product.product_normal_form_view" /> <field name="arch" type="xml"> <data> <xpath expr="//field[@name='name']" position="attributes"> <attribute name="required">1</attribute> </xpath> <xpath expr="//field[@name='standard_price']" position="replace"> <group name='cost_prices' colspan="2" col="4"> <field name="standard_price" nolabel="1" attrs="{'readonly':[('cost_method','=','average')]}"/> <field name="cost_price_extra" groups="product.group_product_variant"/> </group> </xpath> <sheet> <group col="2" colspan="2" groups="base.group_extended" position="replace"> <group colspan="2" col="6" name="weight" groups="base.group_extended"> <field name="is_multi_variants" invisible="1"/> <group colspan="2" col="2"> <separator string="Template Weights" colspan="2"/> <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/> </group> <group colspan="2" col="2" attrs="{'invisible':[('is_multi_variants','=',False)]}"> <separator string="Variant Weights" colspan="2"/> <field digits="(14, 3)" name="additional_volume" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="additional_weight" attrs="{'readonly':[('type','=','service')]}"/> <field digits="(14, 3)" name="additional_weight_net" attrs="{'readonly':[('type','=','service')]}"/> </group> <group colspan="2" col="2" attrs="{'invisible':[('is_multi_variants','=',False)]}"> <separator string="Total Weights" colspan="2"/> <field digits="(14, 3)" name="total_volume"/> <field digits="(14, 3)" name="total_weight"/> <field digits="(14, 3)" name="total_weight_net"/> </group> </group> </group> </sheet> </data> </field> </record> <!-- 隐藏 open_ui 按钮 --> <record model="ir.ui.view" id="pos_session_opening_form_view_openui"> <field name="name">pos.session.opening.form.view.openui</field> <field name="model">pos.session.opening</field> <field name="inherit_id"ref="point_of_sale.pos_session_opening_form_view"/> <field name="arch"type="xml"> <xpath expr="//button[@name='open_ui']"position="replace"> <button name="open_ui"type="object"string="Start Selling"attrs="{'invisible' : [('pos_state', 'not in', ('opened',))]}"class="oe_highlight"invisible="True"/> </xpath> </field> </record> <record id="product_search_form_view_filter"model="ir.ui.view"> <field name="name">product.search.form.filter</field> <field name="model">product.product</field> <field name="inherit_id"ref="product.product_search_form_view"/> <field name="arch"type="xml"> <filter name="consumable"position="after"> <separator/> <filter name="filter_to_qty_available"string="在手数量>0"icon="terp-accessories-archiver+"domain="[('qty_available', '>', 0)]"/> <filter name="filter_to_virtual_available"string="预测数量>0"icon="terp-accessories-archiver+"domain="[('virtual_available', '>', 0)]"/> </filter> </field> </record> <!-- Partner kanban view inherte --> <record model="ir.ui.view"id="crm_lead_partner_kanban_view"> <field name="name">res.partner.kanban.saleorder.inherit</field> <field name="model">res.partner</field> <field name="inherit_id"ref="base.res_partner_kanban_view"/> <field name="priority"eval="20"/> <field name="arch"type="xml"> <field name="mobile"position="after"> <field name="sale_order_count"/> </field> <xpath expr="//div[@class='oe_kanban_partner_links']"position="inside"> <a name="%(sale.act_res_partner_2_sale_order)d"type="action"t-if="record.sale_order_count.value>0"> <t t-esc="record.sale_order_count.value"/> Sales </a> </xpath> </field> </record> <!-- Partners inherited form --> <record id="view_task_partner_info_form"model="ir.ui.view"> <field name="name">res.partner.task.info.inherit</field> <field name="model">res.partner</field> <field name="inherit_id"ref="base.view_partner_form"/> <field name="arch"type="xml"> <xpath expr="//page[@name='page_history']"position="attributes"> <attribute name="invisible">False</attribute> </xpath> <xpath expr="//page[@name='page_history']"position="inside"> <group name="grp_task"string="Tasks"> <field name="task_ids"colspan="4"nolabel="1"> <tree string="Tasks"editable="bottom"> <field name="name"/> <field name="user_id"/> <field name="date_deadline"/> <field name="state"invisible="1"/> <button name="do_open"states="pending,draft,done,cancelled"string="Start Task"type="object"icon="gtk-media-play"help="For changing to open state"invisible="context.get('set_visible',False)"/> <button name="action_close"states="draft,pending,open"string="Done"type="object"icon="terp-dialog-close"help="For changing to done state"/> </tree> </field> </group> </xpath> </field> </record>

猜你喜欢

转载自www.cnblogs.com/zcy1103/p/9667814.html
今日推荐