Skip to main content
iVentureTeam

section_and_note_text

On sale orders and invoices, one widget decides how the description cell edits: section_and_note_text, a tiny dispatcher that reads the line's display_type. The Odoo 20 branch removes it.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 18, 2026Updated August 18, 20266 min read
Technical namesection_and_note_text
Field typeschar, text (the description column of order and invoice lines)
Viewslist (inside section_and_note_one2many line grids), form
Also registered aslist.section_and_note_text, using the list text component for non-section rows
Moduleaccount, installed with Invoicing or Accounting
Used in core6 occurrences across account, l10n_in, sale_management, purchase
VersionsOdoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. It is wired in the line views of quotations, orders and invoices; Studio does not expose it
Alternativesproduct_label_section_and_note_field, text, char

What the Section and Note Text field does

Order and invoice line grids in Odoo hold three kinds of rows in one table: product lines, section headers, and free-text notes, distinguished by the display_type field on the line. The description column has to edit differently for each: a section title is one line of text, a note or product description can be several.

section_and_note_text is the component that makes that decision. Its entire logic is a getter choosing which standard widget to render: CharField when the record's display_type is line_section, TextField otherwise. The list registration refines the fallback to the list-optimized ListTextField so multiline editing behaves inside the grid.

Its descriptor is the most minimal in this series: a component and a CSS class, no options, no supported types, no extractProps. Configuration happens entirely through the data.

What this means for your team

Sections and notes are how a quotation stops being a parts list and starts being a proposal: phases with subtotals, scope descriptions between lines, terms embedded where they apply. Sales teams live in this structure daily, which makes its editing behavior part of the selling experience: a section header that suddenly grew a huge multiline editor, or a note squeezed into one line, breaks the rhythm of building a quote.

For customizers the widget matters mostly as a boundary marker. If you are changing how the description cell edits, this is your widget. If you are changing anything structural, section subtotals, collapsing, where the Add a section button inserts, you are in the companion one2many widget's territory (a page we cover separately when it enters the inventory; the widget lives in the same source file). Knowing the boundary saves hours of reading the wrong component.

Working examples

How core uses it (order line grid)

<field name="name"
       widget="section_and_note_text"
       optional="show"/>

Inside a one2many whose parent field uses section_and_note_one2many, so the row types exist in the first place.

The data that drives it

{"display_type": "line_section", "name": "Phase 1: Discovery"}
{"display_type": false, "name": "Odoo implementation, 40 hours"}
{"display_type": "line_note", "name": "Travel billed at cost."}

Same field, three renders: single-line editor for the section, multiline for the product line and the note.

This widget versus section_and_note_one2many

Most questions about section rows are actually questions about the companion widget, so here is the split, verified in the shared source file.

This widget owns the cell. Choosing char versus text editing for the description column is its entire job.

The one2many widget owns the rows. section_and_note_one2many extends the x2many list renderer with everything people associate with sections: hiding other columns on section rows via a colspan, the Add a section and Add a note buttons, section duplication and deletion cascading to their lines, drag-drop rules, and, new in 19.0, subsections and collapsible composition and prices driven by aggregated_fields, hide_composition, hide_prices and subsections attributes and options on the parent field.

The model owns the vocabulary. display_type values come from the line model. Adding your own row type means model work plus renderer work; this widget would only need touching if the new type should edit single-line.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The widget and its registrations are removed on the current development branch; see below.
Odoo 19.0VerifiedVerified against the shipped source; the file also gains subsections machinery for the companion widget.
Odoo 18.0VerifiedWidget present with the same dispatch logic.
Odoo 17.0VerifiedWidget present with the same dispatch logic.
Odoo 16.0VerifiedWidget present; a parallel legacy implementation also shipped for the old view engine.

Upgrade note. From 16.0 through 19.0 the widget is a stable passenger of the account module (16.0 even shipped a parallel legacy implementation for the old view engine). Views reference it by name only, so upgrades within that range are uneventful. The development branch is another story, below.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable until release, and we re-verify this page against the shipped version.

On the current master branch, this widget is gone: the section_and_note_text and list.section_and_note_text registrations and the SectionAndNoteText component are removed from section_and_note_fields_backend.js, and we found no other file in the master tree registering the name. The section machinery itself survives, section_and_note_one2many remains registered, and the description column's product-line duties sit with product_label_section_and_note_field, which master extends with new options. What this means practically: custom views that set widget="section_and_note_text" on a field will fall back to the field's default widget after an upgrade to 20, losing the per-row-type editor switch, and should be reviewed during migration. As always, the branch can still change before release.

Common problems and fixes

SymptomCause and fix
Section titles open a multiline editorThe row's display_type is not exactly line_section, or the column uses the plain text widget. Check the widget on the name field and the display_type values in the data.
Notes are squeezed to a single lineThe column renders the plain char widget instead of this dispatcher. Set widget="section_and_note_text" on the description field of the line grid.
Section rows do not span the tableColumn spanning is the renderer's job, driven by the parent field's widget. Ensure the one2many field itself uses section_and_note_one2many; this cell widget cannot produce colspans.
Widget used on a model without display_type does nothing specialThe dispatcher reads record.data.display_type; when the field is absent the check is never true. Expected: every row gets the multiline editor. Add a display_type selection to the model if you want section behavior.
After testing on the Odoo 20 branch, the widget is unknownThe registrations are removed on master. Plan custom views around the default text widget or the product label field widget when preparing an Odoo 20 migration.

Section and Note Text field vs the alternatives

WidgetBest forKey difference
section_and_note_textDescription cells in section-aware line gridsSwitches char versus text editing per row type at render time
product_label_section_and_note_fieldThe combined product and label column on modern invoice linesA many2one-based composite that carries the section logic forward, extended on the Odoo 20 branch
textPlain multiline descriptions everywhereAlways multiline, no row-type awareness
charSingle-line text without dispatchAlways one line, regardless of row type

The practical test: use this widget only where section and note rows genuinely exist, inside the section-aware line grids. Everywhere else the plain char or text widget does the same job without the dispatch.

Frequently asked questions

What does section_and_note_text do on Odoo order lines?+
It renders the description cell and picks the editor per row type: section header rows (display_type = 'line_section') get a single-line char editor, product lines and notes get the multiline text editor. In list grids the multiline path uses the list-optimized text component via the list.section_and_note_text registration.
How do I add sections and notes to my own one2many?+
Three pieces: a display_type selection on the line model, the parent field rendered with section_and_note_one2many, and the description column rendered with section_and_note_text. The one2many widget brings the Add a section and Add a note buttons and the row styling.
Why doesn't the widget have any options?+
Its descriptor is just a component plus a CSS class; there is nothing to configure from the view. All behavior derives from the record's display_type value, which we verified in the 19.0 source.
What are subsections in Odoo 19?+
19.0 introduced a third row type, line_subsection, handled by the companion one2many renderer together with collapsible composition and prices. For this cell widget subsections simply take the multiline path, because only line_section triggers the char editor.
Is section_and_note_text removed in Odoo 20?+
On the current development branch, yes: the component and both registrations are gone from the account module, while section_and_note_one2many stays. Custom views using the widget name would silently fall back to the default widget. The branch is unstable until the September 2026 release, and we will re-verify this page then.
Which apps use this widget in core?+
Six usages across account (invoices), sale_management (quotation templates), purchase (orders) and l10n_in. Anywhere you see section and note rows in a line grid, this widget is rendering the description cell.

Quotes that read like part lists instead of proposals?

Sections, notes, subtotals and collapsible phases turn Odoo quotations into documents clients actually sign. We structure order and invoice line views, and keep customizations like these survivable across releases, including the widget removal already visible for Odoo 20.

Book a free consultation

How this page was produced

This page was verified by reading section_and_note_fields_backend.js in the Odoo 19.0 account module, the component's three registrations, and the surrounding renderer code that owns the row-level behavior, then diffing the file across 16.0 through master. The Odoo 20 removal was confirmed by searching the master branch's account module for the registration names and finding none. The Odoo 20 section reads the unreleased development branch and is marked as such. Corrections welcome via our contact page.