Mastering Odoo 19 Views: Complete Guide with Sales Module Examples

Jul 26, 2026NinjaFunction Team
OdooViewsERPOdoo DevelopmentForm ViewList ViewKanban ViewPivot ViewGraph ViewCalendar ViewActivity ViewCohort ViewGrid ViewGantt ViewMap View
Mastering Odoo 19 Views: Complete Guide with Sales Module Examples

Introduction

Views are the core components that determine how your data is displayed and interacted with in Odoo. While business objects like customers, products, or invoices are stored in models, views make these records visible, understandable, and actionable. Defined in XML, views control how records appear on the screen and how users interact with them.

In this comprehensive guide, we'll explore all the view types available in Odoo 19 using the Sales module as our practical example. You'll learn how each view works, when to use it, and how to customize it for your specific business needs.

Complete Odoo 19 Views Overview

Mastering Odoo views is essential for creating effective business applications. Each view type serves a specific purpose:

View TypePurposeBest Use Case
Form ViewDetailed record editing and creationViewing/editing single records
List/Tree ViewQuick overview and bulk operationsViewing multiple records in table format
Kanban ViewVisual workflow and pipeline managementSales pipeline, project boards
Search ViewAdvanced filtering and groupingFinding specific records quickly
Pivot ViewMulti-dimensional data analysisSales analysis, financial reporting
Graph ViewVisual data representation with chartsPerformance dashboards, trends
Calendar ViewTime-based scheduling and planningAppointments, deadlines, events
Activity ViewTask and follow-up managementSales follow-ups, task tracking
Cohort ViewTrack groups of records over timeRetention analysis, subscription tracking
Grid ViewSpreadsheet-like data editingBulk price updates, inventory management
Gantt ViewProject planning with timeline visualizationProject management, resource allocation
Map ViewGeographic visualization of recordsLogistics, field operations, distribution

Odoo View Basics

Views in Odoo are XML-defined structures that present data from models in various formats. Each view is stored in the ir.ui.view model. Here's the basic structure:

<record id="model_view_type" model="ir.ui.view">
    <field name="name">view.name</field>
    <field name="model">model.name</field>
    <field name="arch" type="xml">
        <view_type>
            <!-- view content -->
        </view_type>
    </field>
</record>

To make views accessible, you need to register them in a window action:

<record id="action_sale_order" model="ir.actions.act_window">
    <field name="name">Sales Orders</field>
    <field name="res_model">sale.order</field>
    <field name="view_mode">kanban,list,form,pivot,graph,calendar,activity,cohort,grid,gantt,map</field>
    <field name="view_id" ref="view_sale_order_kanban"/>
</record>

1. Form View

The Form view displays detailed information about a single record. It organizes fields, sections, and tabs in a structured layout, making it easy to view, edit, or create a record.

Sales Order Form View Example

<record id="view_sale_order_form_custom" model="ir.ui.view">
    <field name="name">sale.order.form.custom</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">
        <form>
            <sheet>
                <div class="oe_title">
                    <h1>
                        <field name="name" placeholder="Quotation #"/>
                    </h1>
                    <h3>
                        <field name="state" widget="label_selection"/>
                    </h3>
                </div>
                <group>
                    <group>
                        <field name="partner_id" options="{'no_create': True}"/>
                        <field name="partner_invoice_id" groups="base.group_no_one"/>
                        <field name="partner_shipping_id" groups="base.group_no_one"/>
                        <field name="pricelist_id"/>
                    </group>
                    <group>
                        <field name="date_order"/>
                        <field name="user_id"/>
                        <field name="company_id" groups="base.group_multi_company"/>
                        <field name="origin"/>
                    </group>
                </group>
                <notebook>
                    <page string="Order Lines">
                        <field name="order_line"/>
                    </page>
                    <page string="Other Information">
                        <group>
                            <field name="note"/>
                            <field name="payment_term_id"/>
                        </group>
                    </page>
                </notebook>
            </sheet>
        </form>
    </field>
</record>
Odoo 19 Form View Example

Key Form View Elements

  • <sheet> – Main container for form content
  • <group> – Organizes fields in columns
  • <notebook> – Creates tabbed sections
  • <page> – Individual tab pages
  • <header> – Button bar at top of form
  • <field> – Individual data fields with attributes

2. List / Tree View

The List view (also called Tree view) displays multiple records in a table format, providing an easy overview and supporting bulk actions.

Sales Order List View Example

<record id="view_sale_order_list_custom" model="ir.ui.view">
    <field name="name">sale.order.list.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <list string="Sales Orders"
              decoration-success="state == 'sale'"
              decoration-danger="state == 'cancel'"
              decoration-warning="state == 'sent'"
              decoration-info="state == 'draft'"
              editable="bottom"
              multi_edit="1"
              default_group_by="user_id"
              default_order="date_order desc"
              create="0"
              import="0">
            <field name="name"/>
            <field name="partner_id" optional="show"/>
            <field name="date_order"/>
            <field name="amount_untaxed" sum="Total"/>
            <field name="state" widget="label_selection" optional="show"/>
            <field name="user_id" optional="hide"/>
            <field name="company_id" groups="base.group_multi_company" optional="hide"/>
        </list>
    </field>
</record>
Odoo 19 List View Example

List View Attributes

AttributeDescription
stringView title
decoration-*Color coding rows (success, danger, warning, info)
editable="bottom"Enable inline row editing
multi_edit="1"Bulk updates on multiple selected records
default_group_byAuto-group records by a field
default_orderDefault sorting order
create="0"Disable record creation
delete="0"Disable record deletion
import="0"Disable CSV/XLS import
limit="80"Records per page (default 80)
optional="show"Make column optional in UI

3. Kanban View

The Kanban view displays records as cards, often organized by status or stage, making workflows visual and intuitive. It supports drag-and-drop functionality for updating record status.

Sales Order Kanban View Example

<record id="view_sale_order_kanban_custom" model="ir.ui.view">
    <field name="name">sale.order.kanban.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <kanban class="o_kanban_mobile" 
                default_group_by="state"
                quick_create="true"
                quick_create_view="sale.view_sale_order_form">
            <field name="name"/>
            <field name="state"/>
            <field name="partner_id"/>
            <field name="amount_total"/>
            <field name="date_order"/>
            <field name="user_id"/>
            <field name="pricelist_id"/>
            <progressbar field="state"
                         colors='{"draft": "info", "sent": "warning", "sale": "success", "cancel": "danger"}'
                         invisible="state == 'cancel'"/>
            <templates>
                <t t-name="card">
                    <div class="oe_kanban_global_click">
                        <div class="d-flex justify-content-between">
                            <strong><field name="name"/></strong>
                            <field name="state" widget="label_selection"/>
                        </div>
                        <div class="mt-2">
                            <div><i class="fa fa-user"/> <field name="partner_id"/></div>
                            <div><i class="fa fa-calendar"/> <field name="date_order"/></div>
                            <div><i class="fa fa-money"/> <field name="amount_total"/></div>
                            <div><i class="fa fa-user"/> <field name="user_id"/></div>
                        </div>
                    </div>
                </t>
            </templates>
        </kanban>
    </field>
</record>
Odoo 19 Kanban View Example

Kanban View Attributes

  • default_group_by – Default grouping field for cards
  • quick_create – Enable inline record creation
  • quick_create_view – Form view used for quick creation
  • <progressbar> – Visual progress indicator

4. Search View

The Search view helps users quickly locate records using filters, grouping, or keyword searches. It appears at the top of list, kanban, and other views.

Sales Order Search View Example

<record id="view_sale_order_search_custom" model="ir.ui.view">
    <field name="name">sale.order.search.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <search string="Search Sales Orders">
            <field name="name" string="Order Number"/>
            <field name="partner_id" string="Customer"/>
            <field name="user_id" string="Salesperson"/>
            <field name="date_order" string="Order Date"/>
            
            <filter string="My Orders" 
                    name="my_orders" 
                    domain="[('user_id','=',uid)]"/>
            
            <filter string="Draft" 
                    name="draft_orders" 
                    domain="[('state','=','draft')]"/>
            
            <filter string="Sent" 
                    name="sent_orders" 
                    domain="[('state','=','sent')]"/>
            
            <filter string="Confirmed" 
                    name="confirmed_orders" 
                    domain="[('state','=','sale')]"/>
            
            <separator/>
            
            <filter string="This Month" 
                    name="this_month" 
                    domain="[('date_order','>=', context_today().strftime('%Y-%m-01'))]"/>
            
            <separator/>
            
            <group expand="1" string="Group By">
                <filter string="Salesperson" 
                        name="group_user" 
                        context="{'group_by': 'user_id'}"/>
                <filter string="Customer" 
                        name="group_partner" 
                        context="{'group_by': 'partner_id'}"/>
                <filter string="State" 
                        name="group_state" 
                        context="{'group_by': 'state'}"/>
                <filter string="Date" 
                        name="group_date" 
                        context="{'group_by': 'date_order'}"/>
            </group>
        </search>
    </field>
</record>
Odoo 19 Search View Example

Search View Elements

  • <field> – Searchable fields
  • <filter> – Predefined filters with domain
  • <group> – Grouping options with context
  • <separator/> – Visual separation between filters

5. Pivot View

The Pivot view summarizes large datasets into a structured table with totals, averages, counts, and other aggregations. It's ideal for sales reports, financial analysis, and inventory tracking.

Sales Analysis Pivot View Example

<record id="view_sale_order_pivot_custom" model="ir.ui.view">
    <field name="name">sale.order.pivot.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <pivot string="Sales Analysis"
               default_order="date_order desc"
               sample="1">
            <field name="date_order" type="row"/>
            <field name="user_id" type="row"/>
            <field name="partner_id" type="col"/>
            <field name="state" type="col"/>
            <field name="amount_untaxed" type="measure" operator="sum"/>
            <field name="amount_total" type="measure" operator="sum"/>
            <field name="order_line" type="measure" operator="count"/>
        </pivot>
    </field>
</record>
Odoo 19 Pivot View Example

Pivot View Types

  • type="row" – Fields displayed as rows
  • type="col" – Fields displayed as columns
  • type="measure" – Fields with aggregations
  • operator – Aggregation function (sum, count, avg, min, max)

6. Graph View

The Graph view visualizes data with charts, supporting bar charts, pie charts, and line graphs to help users quickly understand data patterns.

Sales Performance Graph View Example

<record id="view_sale_order_graph_custom" model="ir.ui.view">
    <field name="name">sale.order.graph.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <graph string="Sales Performance" 
               type="bar" 
               sample="1">
            <field name="date_order" type="row"/>
            <field name="user_id" type="col"/>
            <field name="amount_total" type="measure" operator="sum"/>
            <field name="order_line" type="measure" operator="count"/>
        </graph>
    </field>
</record>
Odoo 19 Graph View Example

Graph View Types

  • type="bar" – Bar chart (default)
  • type="pie" – Pie chart
  • type="line" – Line graph
  • stacked="True" – Stacked bar chart

7. Calendar View

The Calendar view organizes records by dates, providing a visual schedule of activities, appointments, or project timelines.

Sales Activities Calendar View Example

<record id="view_sale_order_calendar_custom" model="ir.ui.view">
    <field name="name">sale.order.calendar.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <calendar string="Sales Calendar"
                  date_start="date_order"
                  date_stop="date_order"
                  color="user_id"
                  mode="month"
                  quick_add="true"
                  event_open_popup="true">
            <field name="name"/>
            <field name="partner_id"/>
            <field name="user_id"/>
            <field name="state"/>
            <field name="amount_total"/>
        </calendar>
    </field>
</record>
Odoo 19 Calendar View Example

Calendar View Attributes

  • date_start – Start date field for events
  • date_stop – End date field for events
  • color – Field used to color-code events
  • mode – Default display mode (day/week/month)
  • quick_add – Enable quick event creation
  • event_open_popup – Open popup for events

8. Activity View

The Activity View shows all planned actions (calls, tasks, meetings) for a record, helping manage follow-ups and scheduling.

Sales Order Activity View Example

<record id="view_sale_order_activity_custom" model="ir.ui.view">
    <field name="name">sale.order.activity.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <activity string="Activities">
            <field name="activity_type_id"/>
            <field name="date_deadline"/>
            <field name="summary"/>
            <field name="user_id"/>
            <field name="partner_id"/>
            <field name="state"/>
            <field name="sale_order_id"/>
        </activity>
    </field>
</record>
Odoo 19 Activity View Example

9. Cohort View

The Cohort view tracks groups of records over time, showing retention, churn, or engagement patterns. It's perfect for subscription-based businesses and customer retention analysis.

Sales Cohort View Example

<record id="view_sale_order_cohort_custom" model="ir.ui.view">
    <field name="name">sale.order.cohort.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <cohort string="Sales Cohort Analysis"
                period="month"
                date_start="date_order"
                mode="churn">
            <field name="partner_id" type="row"/>
            <field name="user_id" type="col"/>
            <field name="amount_total" type="measure" operator="sum"/>
        </cohort>
    </field>
</record>
Odoo 19 Cohort View Example

Cohort View Attributes

  • period – Time period (day, week, month, quarter, year)
  • date_start – Start date field for cohort analysis
  • mode – Analysis mode (churn, retention, sum, max, min)
  • timeline – Date field for timeline tracking

10. Grid View

The Grid view provides a spreadsheet-like interface for editing records in bulk. It's ideal for scenarios like updating product prices, inventory levels, or configuring multiple items simultaneously.

Sales Order Grid View Example

<record id="view_sale_order_grid_custom" model="ir.ui.view">
    <field name="name">sale.order.grid.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <grid string="Sales Order Grid">
            <field name="name"/>
            <field name="partner_id" editable="true"/>
            <field name="date_order" editable="true"/>
            <field name="amount_total" editable="true"/>
            <field name="state" readonly="true"/>
            <field name="user_id" editable="true"/>
        </grid>
    </field>
</record>
Odoo 19 Grid View Example

Grid View Attributes

  • editable="true" – Make field editable in grid
  • readonly="true" – Make field read-only
  • valid_columns – Valid column definitions
  • valid_rows – Valid row definitions

11. Gantt View

The Gantt view visualizes project tasks, milestones, and dependencies on a timeline, making it essential for project management and resource planning.

Sales Project Gantt View Example

<record id="view_sale_order_gantt_custom" model="ir.ui.view">
    <field name="name">sale.order.gantt.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <gantt string="Project Timeline"
               date_start="date_order"
               date_stop="date_order"
               color="user_id"
               default_group_by="user_id"
               progress="amount_total / 100">
            <field name="name"/>
            <field name="partner_id"/>
            <field name="user_id"/>
            <field name="state"/>
            <field name="amount_total"/>
        </gantt>
    </field>
</record>
Odoo 19 Gantt View Example

Gantt View Attributes

  • date_start – Start date for tasks
  • date_stop – End date for tasks
  • color – Color-coding field
  • progress – Progress calculation expression
  • default_group_by – Default grouping
  • scale – Time scale (day, week, month, year)

12. Map View

The Map view displays records on a geographic map, visualizing locations for logistics, field operations, distribution, or customer mapping.

Sales Locations Map View Example

<record id="view_sale_order_map_custom" model="ir.ui.view">
    <field name="name">sale.order.map.custom</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <map string="Sales Locations"
             res_partner="partner_id">
            <field name="partner_id"/>
            <field name="amount_total"/>
            <field name="date_order"/>
            <field name="state"/>
        </map>
    </field>
</record>
Odoo 19 Map View Example

Map View Attributes

  • res_partner – Partner field with address data
  • field_name – Field containing location data
  • latitude – Latitude field (if not using res_partner)
  • longitude – Longitude field (if not using res_partner)
  • cluster – Enable clustering of markers

13. View Inheritance (Customization)

View inheritance is the most frequent method for customizing Odoo's user interface. It allows you to modify existing views by adding new elements, changing attributes, or removing elements.

Adding a Custom Button to Sales Order Form

<record id="view_sale_order_inherit_custom" model="ir.ui.view">
    <field name="name">sale.order.inherit.custom</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">
        <!-- Add new field -->
        <xpath expr="//field[@name='partner_id']" position="after">
            <field name="custom_field" string="Custom Field"/>
        </xpath>
        
        <!-- Add custom button -->
        <xpath expr="//header" position="inside">
            <button name="custom_action" 
                    string="Custom Button" 
                    class="btn-primary" 
                    type="object"/>
        </xpath>
        
        <!-- Add new tab -->
        <xpath expr="//notebook" position="inside">
            <page string="Custom Tab">
                <group>
                    <field name="custom_field_1"/>
                    <field name="custom_field_2"/>
                </group>
            </page>
        </xpath>
        
        <!-- Modify field attribute -->
        <xpath expr="//field[@name='name']" position="attributes">
            <attribute name="readonly">1</attribute>
            <attribute name="string">Order Number</attribute>
        </xpath>
    </field>
</record>

XPath Position Values

PositionDescription
beforeInsert before matched element
afterInsert after matched element
insideInsert within matched element
replaceReplace matched element
attributesModify attributes of matched element

14. Using Context with Views

Context is a Python dictionary that passes temporary information to views, allowing dynamic behavior and default values.

Common Context Patterns

<!-- Set default values -->
<field name="context">
    {'default_partner_id': active_id, 'default_state': 'draft'}
</field>

<!-- Apply default filters in search view -->
<field name="context">
    {'search_default_my_orders': 1, 'search_default_draft_orders': 1}
</field>

<!-- Auto-group in views -->
<field name="context">
    {'group_by': 'user_id'}
</field>

<!-- Pass partner context -->
<button name="%(action_sale_order)d" 
        type="action" 
        context="{'partner_id': active_id}"/>

Conclusion

Mastering Odoo views is essential for creating effective business applications. Each view type serves a specific purpose:

  • Form View – Detailed record editing
  • List View – Quick overview and bulk operations
  • Kanban View – Visual workflow management
  • Search View – Advanced filtering and grouping
  • Pivot View – Data analysis and aggregation
  • Graph View – Visual data representation
  • Calendar View – Time-based scheduling
  • Activity View – Task and follow-up management
  • Cohort View – Retention and trend analysis
  • Grid View – Spreadsheet-like bulk editing
  • Gantt View – Project timeline visualization
  • Map View – Geographic location visualization

By understanding how to define, customize, and use these views with the Sales module, you can create powerful and intuitive user interfaces for any business requirement.

Reference