🔍 Come ereditare una search view in Odoo
Quando sviluppiamo in Odoo, capita spesso di dover modificare la search view di un modello esistente per aggiungere nuovi filtri o campi di ricerca.
La buona notizia è che Odoo ci offre un modo elegante per ereditare e personalizzare queste viste, senza dover riscrivere tutto da zero.
Ecco come fare 👇
✅ Obiettivo
Vogliamo aggiungere un nuovo filtro alla search view del modello sale.order.
🧩 Esempio pratico
Nel tuo file XML (views/extended_sale_order_views.xml):
<odoo>
<data>
<record id="view_order_filter_inherit" model="ir.ui.view">
<field name="name">sale.order.search.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_sales_order_filter"/>
<field name="arch" type="xml">
<!-- Inseriamo il nuovo filtro alla fine dei filtri esistenti -->
<xpath expr="//filter[last()]" position="after">
<filter name="my_filter" string="Ordini alti" domain="[('amount_total', '>', 10000)]"/>
</xpath>
</field>
</record>
</data>
</odoo>
-
inherit_id: è la search view originale che stiamo estendendo (in questo caso quella dell’app Vendite). -
<xpath>: ci permette di inserire il nuovo filtro in un punto preciso della vista esistente. -
Il
domaindefinisce la logica del filtro (qui, tutti gli ordini con importo superiore a 10.000). -
Altro esempio:
-
<!--Inherit picking search view--> <record model="ir.ui.view" id="stock_picking_expand_inherit_search"> <field name="name">stock.picking.search.expand.filter</field> <field name="model">stock.picking</field> <field name="inherit_id" ref="stock.view_picking_internal_search"/> <field name="arch" type="xml"> <xpath expr="//field[@name='name']" position="replace"> <field name="name" string="Transfer" filter_domain="['|','|', ('name', 'ilike', self), ('origin', 'ilike', self),('move_line_ids.product_id.categ_id','child_of',self)]"/> </xpath> </field> </record>
🚀 Inserire un campo nel search input
Vuoi aggiungere un campo personalizzato nel campo di ricerca “a destra”? Basta usare <field name="..." filter_domain="..."/> dentro l’<xpath> giusto.
<xpath expr="//search" position="inside">
<field name="x_stato_custom" string="Stato custom" filter_domain="[('x_stato_custom', '=', self)]"/>
</xpath>