Skip to main content
iVentureTeam

text

Odoo's Multiline Text widget: the auto-growing textarea behind every notes box. Two documented options, two undocumented ones, and a quiet type change in Odoo 19.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 11, 2026Updated August 11, 20267 min read
Odoo 19 form view showing a notes field rendered by the text widget as a multiline textarea that grows with its content.
Studio nameMultiline Text
Technical nametext
Field typestext, char, html
Viewsform, list, kanban
Also registered aslist.text
Moduleweb, present in every Odoo database
Used in core25 explicit occurrences across 17 modules, including mail, project, hr_holidays, website_slides, hr_timesheet, product, plus every Text field rendered by default
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupYes, via Odoo Studio (Enterprise): the Multiline Text field type
Alternativeschar, html, text_emojis, sol_text

What the Multiline Text field does

Every notes box, description area and internal comment field in Odoo runs through this widget. It is the default renderer for Text fields, so it appears far more often than its 25 explicit XML mentions suggest: write fields.Text() on a model and this is what users type into.

The component wraps a textarea with the quality-of-life features users never notice until they are missing: the box grows as content grows instead of scrolling internally, browser spellcheck is wired up, translatable fields get the translation flag button, and fields configured for it get a placeholder, static or dynamic. In list views a separately registered list.text variant starts at a single row so table cells stay compact.

Less obviously, the widget also declares support for html fields, where it edits the raw markup with no rich-text editor, and, new in Odoo 19, for char fields.

What this means for your team

Free text is where process detail actually lives: handover notes, delivery instructions, interview feedback. The widget-level decisions look small but shape data quality. A field that opens at two rows invites two sentences; a single-line box invites a fragment. Choosing rows deliberately on your key forms is free UX design.

The line_breaks option is the underrated control. Turned off, the field refuses the Enter key, which is precisely what you want for values that must stay single-line, reference strings, one-line summaries fed into reports, without giving up Text-field storage. Teams usually discover this option only after a report breaks on an embedded newline.

And if your templates use placeholder text to coach users, the dynamic placeholder can pull that coaching from another field on the record, per record type, a trick core uses in mail templating and almost nobody uses in custom modules because it is documented nowhere.

Setting it up in Odoo Studio (no code)

This widget is a first-class Studio citizen. Odoo Studio is available on Enterprise plans.

  1. Open the form you want to change and click Studio in the top menu.

  2. Drag Multiline Text from the New Fields section onto the form. Studio creates a Text field with this widget as its default rendering.

  3. In the Properties tab, set a Placeholder to show example text until a value is entered, and a Help Tooltip for the question-mark hint.

  4. To edit raw HTML on an existing Html field instead, select that field and set its Widget to Multiline Text; the official Studio docs describe this exact combination for disabling the HTML editor.

Tip: turn on developer mode before adding the field to set a clean technical name; Studio's generated x_studio_ names are unpleasant to reference from reports later.

What Studio cannot do here

Studio covers creating the field, the placeholder and visibility rules. Three things stay in view XML.

The starting height is the rows attribute on the view, which Studio does not expose. Two rows is the code default.

Blocking line breaks is the line_breaks option, also absent from Studio's properties panel.

Dynamic placeholders, where the gray hint text comes from another field, need two options wired together in XML, shown below. If these small refinements are stacking up on your forms, that is standard view customization work, quick for someone who does it daily.

Supported options in Odoo 19

Verified against text_field.js in the Odoo 19.0 web module. Two options are declared in supportedOptions; the two dynamic placeholder switches below exist only in extractProps. One oddity is worth naming: the declared placeholder_field option is not read by this widget's extractProps at all, while the undeclared dynamic_placeholder pair is what actually drives the feature.

OptionTypeWhat it does
line_breaksbooleanWhen false, the Enter key is suppressed, the field renders one row high and the autoresize floor drops to zero. Stored newlines are not stripped.(default: true)
placeholder_fieldfield nameDeclared in supportedOptions but never read by this widget's extractProps in 19.0. Setting it has no effect here; the dynamic placeholder feature uses the two options below.
dynamic_placeholderbooleanEnables the dynamic placeholder picker, inserting {{object....}} expressions at the cursor. Read in extractProps; appears in no documentation.(default: false)
dynamic_placeholder_model_reference_fieldfield nameField on the current record naming the model the placeholder picker browses. Used with dynamic_placeholder. Also undocumented.

line_breaks: false changes three things at once, all visible in the source: the Enter key is suppressed in the input hook, the rendered height drops to a single row, and the minimum height falls to zero. It does not strip newlines already stored in the value.

Working examples

Standard notes box, taller by default

<field name="description" widget="text" rows="5"/>

The rows attribute sets the starting height; the box still grows as users type.

Single-line behavior on a Text field

<field name="reference_note"
       widget="text"
       options="{'line_breaks': False}"/>

Enter is refused, so the stored value can never contain a newline.

Dynamic placeholder from another field

<field name="body_text"
       widget="text"
       options="{'dynamic_placeholder': True, 'dynamic_placeholder_model_reference_field': 'model_id'}"/>

Opens the placeholder picker against the model referenced by model_id, inserting expressions like {{object.partner_id.name}} at the cursor. This is the mechanism mail template bodies use.

Raw HTML editing on an html field

<field name="body_html" widget="text"/>

No editor, no sanitizer UI, just the markup in a textarea. Studio exposes the same thing as the Multiline Text widget choice on an Html field.

Trim rules, the unread option, and the 19-only char support

Reading the full component turns up behavior worth having on record.

Trimming belongs to the field, not the widget. On blur, the widget trims the value only if the field definition carries the trim flag, which char fields have by default in the ORM. Whether your users' trailing spaces survive is decided in Python, and this widget just obeys.

The declared option nobody reads. supportedOptions lists placeholder_field, and Studio-style tooling displays it, but extractProps never consumes it; the feature actually rides on dynamic_placeholder plus dynamic_placeholder_model_reference_field. If you set placeholder_field on this widget and nothing happens, that is why.

Autoresize has a floor. With line breaks on, the textarea keeps a minimum height of 50 pixels and starts at the rows value, growing from there. The list.text variant zeroes the floor and starts at one row, which is why long notes stay tidy inside list cells until clicked.

Char support is new in 19. The 18.0 file declares ["html", "text"]; 19.0 adds char, making text a legitimate widget for size-limited fields that want multiline entry. Remember the char field's size still caps the length.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The development branch shows identical options and types; internals only. See below.
Odoo 19.0VerifiedVerified against the shipped source. char joins html and text as a declared type.
Odoo 18.0Partial / changedSame options, but declared types are html and text only; char is not a supported combination.
Odoo 17.0VerifiedWidget present with the same registry name. Not re-verified line by line for this page.
Odoo 16.0VerifiedWidget present with the same registry name. Not re-verified line by line for this page.

Upgrade note. Views from 16 through 18 carry over unchanged. The one addition to know: putting widget="text" on a char field only became a declared, supported combination in 19, so backport that pattern with care.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. We diffed this widget's file against the public development branch at the time of writing; the branch is unstable until feature freeze, and we re-verify after release.

No option changes: supportedOptions, supportedTypes and extractProps are byte-for-byte identical to 19, including the unread placeholder_field declaration and the undocumented dynamic placeholder pair. All movement is internal, the migration to the new Owl props and signals syntax, which affects JavaScript patches and nothing in XML.

Common problems and fixes

SymptomCause and fix
Enter key does nothing in the fieldline_breaks is set to false, which suppresses it by design. Remove the option if multiline entry is wanted.
placeholder_field option has no effectThe option is declared but never read by this widget's extractProps in 19. Use dynamic_placeholder with dynamic_placeholder_model_reference_field instead.
Trailing spaces disappear on saveThe field definition carries the ORM trim flag; the widget trims on blur when it does. Define the field with trim disabled if trailing whitespace is meaningful.
HTML field shows raw tags instead of the editorwidget="text" on an html field edits markup without the editor, by design. Remove the widget override to get the rich-text editor back.
Field starts too short on the formThe default starting height is two rows. Set rows="5" or similar on the field in the view.
Same field renders one row in the list but taller on the formThe separately registered list.text variant starts at one row inside list cells. Expected behavior; no action needed.

Multiline Text field vs the alternatives

WidgetBest forKey difference
textPlain multiline text: notes, descriptions, instructionsAuto-growing textarea with spellcheck, translation flag and placeholder support
charSingle-line values and identifiersOne line, no growth, size-capped storage
htmlFormatted content: descriptions, emails, termsFull rich-text editor storing markup
text_emojisMultiline text with an emoji picker, as in SMS composersAdds the emoji button to the same textarea
sol_textSale order line descriptionsSale-specific variant tuned for line notes

The test: does the content have structure? Formatting for humans means html. One short machine-readable line means char. Multiple plain sentences mean this widget.

Frequently asked questions

What is the text widget in Odoo?+
It is the default widget for Text fields: an auto-growing textarea with browser spellcheck, a translation button on translatable fields, and placeholder support. In Odoo 19 it declares support for text, html and char fields, and a separate list.text variant keeps it one row tall inside list views.
How do I make a Text field start taller?+
Set the rows attribute on the field in the view, for example rows="5". The code default is two rows, and the box grows automatically as content is added regardless of the starting height. Studio does not expose this attribute; it is a view XML change.
How do I stop users entering line breaks?+
Set options="{'line_breaks': False}". Verified in the source, this suppresses the Enter key, renders the field one row high and drops the height floor to zero. Newlines already stored in existing values are not removed retroactively.
Can I use the text widget on a char field?+
In Odoo 19, yes: char was added to the declared supported types, so a size-limited field can offer multiline-style entry. Odoo 18 declared only html and text, so treat the pattern as 19-plus. The char field's size limit still applies.
What does the text widget do on an HTML field?+
It edits the raw markup in a plain textarea, without the rich-text editor. Odoo's Studio documentation describes exactly this pairing: choosing the Multiline Text widget on an Html field to disable the editor, which is useful for template snippets where you want full control of the markup.
How does the dynamic placeholder work?+
Two undocumented options drive it, both read from the source: dynamic_placeholder switches the feature on, and dynamic_placeholder_model_reference_field names the field on the current record that identifies which model's fields the picker browses. Chosen expressions are inserted at the cursor as {{object.field}} placeholders, the same mechanism mail templates use.
Will the text widget change in Odoo 20?+
The development branch shows no changes to options, types or behavior; only the internal component syntax migrates to the new Owl style. Odoo 20 is expected at Odoo Experience in late September 2026, and we re-verify this page against the shipped release.

Forms that collect the right words?

Notes fields sized to their job, single-line rules where reports demand them, and template placeholders your team can actually use: small text-field tuning with outsized data-quality payoff. We polish Odoo forms like this across 16 to 19.

Book a free consultation

How this page was produced

Every statement on this page was read from the Odoo 19.0 web module source, text_field.js, including its supportedOptions, extractProps and the list.text registration. The 18.0 branch of the same file was compared for the type-support change, and the Odoo 20 section reflects a diff against the public development branch, clearly marked as unreleased. The Studio steps follow the official Studio field documentation. Spotted an error? Tell us and we will correct the page.