Skip to main content
iVentureTeam

product_label_section_and_note_field

On an Odoo invoice line the Product column secretly edits two fields at once: the product_id many2one and the line description. The product_label_section_and_note_field widget is what stitches them together, and it also styles section, subsection and note lines.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 24, 2026Updated August 24, 20265 min read
Technical nameproduct_label_section_and_note_field
Field typesmany2one
Viewslist (inside invoice and order line tables), form
Moduleaccount
Used in core3 occurrences across 3 modules: account invoice lines, purchase order lines and point_of_sale order lines
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. Applied via the widget attribute in view XML
Alternativessection_and_note_text, many2one, so_line_field

What the Product and Label field does

The product_label_section_and_note_field widget is applied to product_id on invoice, purchase and PoS order lines. It renders a many2one autocomplete for the product and, next to it, an auto resizing textarea for the line description, even though the description actually lives in a different field, the line's name.

The label logic is the interesting part. When displaying, the widget takes the name value and strips the product's display name out of it, showing only the remainder as the editable label. When parsing your edit back, it prepends the product name again, storing product\nyour label in name. That is why deleting the label text resets the description to just the product name.

The widget also carries the section and note styling for the whole line: display_type of line_section renders bold, line_subsection semi-bold, and line_note italic.

What this means for your team

For finance and sales teams this widget is why Odoo invoice lines feel like a document editor: one column holds the product, a free text description underneath, and structural section and note rows in between, without switching views. Customer facing descriptions can be rewritten per invoice without touching the product master.

The show_label_warning option adds quiet quality control: when a line's description no longer contains the product name, the label renders in warning orange. Accounting teams use that to spot lines where someone overwrote the description so aggressively that the invoice no longer says what was sold.

Supported options in Odoo 19

The widget spreads the standard many2one descriptor, so every many2one option works here, and it declares one option of its own, show_label_warning. The two undocumented many2one extras that only exist in extractProps pass through as well.

OptionTypeWhat it does
show_label_warningbooleanWhen true, the description label renders in warning orange whenever the line has a product but the label no longer contains the product name. Sections, subsections and notes are excluded from the check. New in 19.0, declared with a Studio visible label.(default: false)(since Odoo 19.0)
no_openbooleanInherited from many2one. Removes the internal link to the product form from the readonly cell.
no_createbooleanInherited from many2one. Disables product creation from the autocomplete entirely, hiding both quick create and the create and edit dialog.
no_quick_createbooleanInherited from many2one. Keeps the create and edit dialog but removes the type-to-create shortcut.
no_create_editbooleanInherited from many2one. Removes the create and edit dialog but keeps quick create from typed text.
search_thresholdintegerInherited from many2one, new in 19.0. Minimum characters typed before the product search runs; unset means the search fires on focus.(since Odoo 19.0)
placeholder_fieldfield nameInherited from many2one, new in 19.0. A char field on the record whose value serves as the dynamic placeholder. Note the widget already forces the placeholder "Search a product" in its template, so this rarely shows.(since Odoo 19.0)
can_scan_barcodebooleanInherited and undocumented: read only in the many2one extractProps, never declared in supportedOptions. Enables barcode scanning to fill the field on mobile.
create_name_fieldfield nameInherited and undocumented: read only in the many2one extractProps. Changes which field of the product receives the typed text on quick create.
show_label_warning only fires on real product lines: sections, subsections and notes are excluded from the check, and so are lines that have no product at all.

Working examples

<!-- Core usage on customer invoice lines (account module) -->
<field name="product_id"
       widget="product_label_section_and_note_field"
       optional="conditional"/>

<!-- With the label warning and no quick create -->
<field name="product_id"
       widget="product_label_section_and_note_field"
       options="{'show_label_warning': True, 'no_quick_create': True}"/>

The parent one2many field on the move uses the companion widget product_label_section_and_note_field_o2m, which supplies the list renderer that hides the separate Description column whenever the Product column is visible, merging both into one cell.

Readonly rules, the column merge, and the 19.0 rebuild

Two behaviors are worth knowing before you customize. First, the readonly logic: the widget keeps the product cell editable even when the list cell reports readonly, until the parent document reaches posted or cancel state or is locked. That is intentional, so draft invoices opened from readonly contexts still allow line edits, and it is implemented both in the field widget and in the o2m list renderer.

Second, the column merge in the o2m renderer is conditional per document type: on vendor bills the Product column defaults to hidden, and on customer invoices the product, quantity and UoM columns default to hidden when the Sale app is not installed. Odoo reads the parent's move_type and an is_sale_installed flag to decide, which is why the same widget shows different default columns on bills and invoices.

In Odoo 18 the widget was self contained inside the account module with its own autocomplete subclasses. Odoo 19 moved the shared logic to ProductNameAndDescriptionField in the product module, added show_label_warning, added the semi-bold line_subsection type, and split the o2m companion into its own file.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Props system migration only on the development branch so far; see below.
Odoo 19.0VerifiedVerified against the shipped source. Rebuilt on the product module base, adds show_label_warning and subsection styling.
Odoo 18.0Partial / changedIntroduced here as a self contained account module widget. No show_label_warning, no line_subsection.
Odoo 17.0Not availableDoes not exist. Invoice lines used the section_and_note family with a separate product column.
Odoo 16.0Not availableDoes not exist.
Introduced in Odoo 18. Views migrated from 18 to 19 keep working unchanged; show_label_warning is simply unavailable on 18.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The changes below are read from the public development branch and are not final until release.

No functional changes so far: the file is being migrated to the new frontend props system (a useProps declaration replacing static props, part of a framework wide wave), and show_label_warning plus the inherited many2one options all survive. The o2m companion file is also still present. We re-verify after the release.

Common problems and fixes

SymptomCause and fix
Editing the label keeps re-adding the product nameBy design. The stored name field is product name plus label; the widget strips the product name for display and prepends it back on save. Edit only the description part. To fully control the stored text, write the name field directly with a server action or code.
The Description column disappeared from invoice linesThe o2m list renderer merges the name column into the Product column whenever both are active. Hide the Product column through the column optional toggle; the Description column then reappears as a standalone column.
Lines are editable even though the form looks readonlyThe widget keeps product and label cells editable until the document is posted, canceled or locked; readonly styling alone does not freeze them. Post or lock the document, or add explicit readonly conditions on the fields if your custom flow needs earlier freezing.
show_label_warning does nothing on section or note linesThe check explicitly excludes sections, subsections and notes, and lines without a product. This is intended. The warning targets only real product lines whose label lost the product name.

Product and Label field vs the alternatives

WidgetBest forKey difference
product_label_section_and_note_fieldInvoice, bill and order lines mixing products, descriptions, sections and notesEdits product_id and the line description together in one cell, with display_type styling
section_and_note_textThe description column in classic section and note tablesText only; no product picker, removed on the development branch
many2oneA plain product column without label editingStandard picker only; the description stays in its own column
so_line_fieldSale order line references on other documentsTracks an edited flag on change instead of merging a description

Pick this widget when a line needs product plus free text in one column. If you only need the section and note structure without products, the account family below is lighter.

Frequently asked questions

Which models use product_label_section_and_note_field in core Odoo?+
Invoice and bill lines (account.move.line), purchase order lines and point of sale order lines. It is always applied on the product_id field, with the matching _o2m widget on the parent one2many.
What does the show_label_warning option do?+
It renders the description label in orange when the line has a product but the description no longer contains the product name, an early warning that someone overwrote the customer facing text. It only applies to real product lines and is new in Odoo 19.
Where is the line description actually stored?+
In the line's name field. The widget displays name with the product display name stripped, and prepends the product name back when you edit, so the stored value is product name, newline, label.
Can I use this widget on Odoo 17 or earlier?+
No. It was introduced in Odoo 18. Earlier versions use the section_and_note widget family with a separate description column.

Invoice lines not behaving the way your team expects?

Merged product columns, disappearing descriptions and section styling are exactly where custom invoice layouts go wrong. We build and repair customized invoice and order line views, from column defaults per document type to fully custom line widgets, on Odoo 16 through 19.

Get your invoice views fixed

How this page was produced

Options and behavior were read from product_label_section_and_note_field.js and its o2m companion in the Odoo 19.0 account module, plus the ProductNameAndDescriptionField base in the product module, including the label strip and prepend logic and the conditional column defaults. The 18.0 file was diffed to date the rebuild, and the Odoo 20 section is a diff against the public development branch. Corrections are welcome via our contact page.