🔍 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
domain
definisce 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>