我需要继承销售点订单搜索视图来添加自定义过滤器。视图是这样定义的
<record id="view_pos_order_filter" model="ir.ui.view">
<field name="name">pos.order.list.select</field>
<field name="model">pos.order</field>
<field name="arch" type="xml">
<search string="Search Sales Order">
<field name="name"/>
<field name="pos_reference"/>
<field name="date_order"/>
<field name="tracking_number"/>
<field name="user_id"/>
<field name="partner_id"/>
<field name="session_id"/>
<field name="config_id"/>
<field name="lines" string="Product" filter_domain="[('lines.product_id', 'ilike', self)]"/>
<filter string="Invoiced" name="invoiced" domain="[('state', '=', 'invoiced')]"/>
<filter string="Posted" name="posted" domain="[('state', '=', 'done')]"/>
<separator/>
<filter string="Order Date" name="order_date" date="date_order"/>
<group expand="0" string="Group By">
<filter string="Session" name="session" domain="[]" context="{'group_by': 'session_id'}"/>
<filter string="User" name="user_id" domain="[]" context="{'group_by': 'user_id'}"/>
<filter string="Point of Sale" name="config_id" domain="[]" context="{'group_by': 'config_id'}"/>
<filter string="Customer" name="customer" domain="[]" context="{'group_by': 'partner_id'}"/>
<filter string="Status" name="status" domain="[]" context="{'group_by': 'state'}"/>
<filter string="Order Date" name="order_month" domain="[]" context="{'group_by': 'date_order'}"/>
</group>
</search>
</field>
</record>
我的继承观是这样的:
<record id="pos_order_view_search_inherit" model="ir.ui.view">
<field name="name">pos.order.view.search.inherit</field>
<field name="model">pos.order</field>
<field name="inherit_id" ref="point_of_sale.view_pos_order_filter"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='user_id']" position='after'>
<filter name="group_by_sales_rep" string="Sales Representative" domain="[]" context="{'group_by':'sales_rep_id'}"/>
</xpath>
</field>
</record>
继承似乎很好(至少在启动时视图解析期间)并且odoo启动没有任何错误。但是,当我在浏览器中进入订单视图时,出现错误,其中部分内容为...
ValueError: Element '<xpath expr="//filter[@name='user_id']">' cannot be located in parent view
我发现其他地方也继承了相同的视图,并且
user_id
过滤器被替换成这样
<record id="pos_order_list_select_inherit" model="ir.ui.view">
<field name="name">pos.order.list.select.inherit</field>
<field name="model">pos.order</field>
<field name="inherit_id" ref="point_of_sale.view_pos_order_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='user_id']" position="replace">
<field name="cashier"/>
</xpath>
<xpath expr="//filter[@name='user_id']" position="replace">
<filter string="Cashier" name="by_cashier" domain="[]" context="{'group_by': 'cashier'}"/>
</xpath>
</field>
</record>
我知道我可以使用不同的 xpath 表达式来完成我需要的操作,但我很好奇继承在这种情况下应该如何工作。 ?
您可以通过这种方式调整您的 xpath,使用
"//filter[@name='by_cashier']"
而不是 "//filter[@name='user_id']"
:
<record id="pos_order_view_search_inherit" model="ir.ui.view">
<field name="name">pos.order.view.search.inherit</field>
<field name="model">pos.order</field>
<field name="inherit_id" ref="point_of_sale.view_pos_order_filter"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='by_cashier']" position='after'>
<filter name="group_by_sales_rep" string="Sales Representative" domain="[]" context="{'group_by':'sales_rep_id'}"/>
</xpath>
</field>
</record>
另一种解决方法:您可以在 Backoffice>Settings>technical>views 中更改继承视图的加载顺序,以便您的自定义视图在另一个视图(用 by_cashier 替换 user_id )之前加载,或者您可以这样实现在 xml 中使用 priority 字段的方式:
<record id="pos_order_view_search_inherit" model="ir.ui.view">
<field name="name">pos.order.view.search.inherit</field>
<field name="model">pos.order</field>
<field name="inherit_id" ref="point_of_sale.view_pos_order_filter"/>
<field name="priority">1</field>
<field name="arch" type="xml">
<xpath expr="//filter[@name='user_id']" position='after'>
<filter name="group_by_sales_rep" string="Sales Representative" domain="[]" context="{'group_by':'sales_rep_id'}"/>
</xpath>
</field>
</record>