Skip to main content
iVentureTeam

survey_description_page

A text cell with two affordances bolted on: a button that opens the row, and a pencil marking section rows. Both depend on the widget around it, which is why it does nothing on its own.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 27, 20266 min read
Technical namesurvey_description_page
Field typeschar, text
Viewslist, inside the survey questions field
Modulesurvey
Used in core1 occurrence, the title column of the survey question list in survey
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. It is a view XML widget, and it only behaves correctly inside a specific parent widget
Alternativeschar, text, question_page_one2many

What the survey title cell does

In the Questions tab of a survey, the title column carries two jobs beyond showing text. It has to let an author jump from a row straight into the full question form, and it has to make section rows look like something that can be opened rather than a bold line of text. This widget adds both to an otherwise ordinary text cell.

In edit mode the input is placed in an input group with a small button beside it, labelled Open section, which asks the surrounding list to open that row. In read mode, rows whose section flag is set get a pencil appended after the text, as a visual hint. Neither affordance changes the value; the field still stores and saves exactly what a plain text field would.

The important thing about it is that it is not self-sufficient. The open button calls a helper that the parent widget publishes into the shared environment. Placed on a normal form field, the widget renders and the button does nothing useful.

What this means for your team

This is a small usability detail with a real effect on how a survey gets built. Authors work in the list, adding and reordering rows quickly, and the moment they need the full question form they should not have to hunt for a way in. A button in the cell they are already editing is the shortest path, and the pencil on section rows answers the silent question of whether that bold row is clickable.

The wider point for custom work is that these small cell-level affordances are cheap. A template inheriting the standard text field, one button and one environment call, and a list becomes navigable. The cost is coupling: the widget now depends on its container, which is fine inside one app and awkward if someone copies the widget name into an unrelated view.

Supported options in Odoo 19

The widget declares no options of its own; it registers the text widget's descriptor with a different template, so everything below is inherited. Two of the inherited keys are read in the base extractor without ever being declared. Read from description_page_field.js and char_field.js, Odoo 19.0.

OptionTypeWhat it does
placeholder_fieldfieldInherited from the text widget. Shows the value of another field as a hint when this one is empty, falling back to the static placeholder attribute.
dynamic_placeholderboolean<strong>Inherited and undeclared on the base widget too.</strong> Read in the extractor to enable the dynamic placeholder machinery.(default: false)
dynamic_placeholder_model_reference_fieldfield<strong>Inherited and undeclared on the base widget too.</strong> Names the field that carries the model reference used by the dynamic placeholder.

The two features are hardcoded. The open button always renders in edit mode, and the pencil is gated on a field literally named is_page. Neither can be configured, and the widget declares no field dependency for is_page, so if the embedded list does not load that field the pencil simply never appears.

Working examples

The core usage

<field name="question_and_page_ids" widget="question_page_one2many">
  <list decoration-bf="is_page">
    <field name="title" widget="survey_description_page"/>
  </list>
</field>

The decoration-bf expression is doing double duty: it bolds section rows and it also causes is_page to be loaded, which the pencil needs.

Making sure the section flag is loaded

<list>
  <field name="is_page" column_invisible="True"/>
  <field name="title" widget="survey_description_page"/>
</list>

Explicit and safer than relying on a decoration expression, since the widget declares no dependency on the field.

What will not work

<!-- on a plain form field: the button has nothing to call -->
<field name="title" widget="survey_description_page"/>

The open button calls a helper published by the parent x2many widget. Outside it, the cell renders but the button is dead.

A cell that depends on its container

The class extends the standard text field and does two things in setup: it calls the parent setup, then adds a layout class to the input element once it exists, so the input shares the row with the button instead of pushing it out. Its only other method asks the environment to open the current record.

That call is the coupling worth knowing about. The environment key it uses is published by question_page_one2many, which sets it up when it mounts. Inside the survey questions list the key is there; anywhere else it is not, and the click resolves to nothing.

The template inherits the base text field template and makes two edits. In the editable branch it replaces the plain input with an input group containing the input and a button carrying the Open section title, whose click is stopped from bubbling so it does not also trigger row selection. In the read-only branch it appends a pencil icon after the formatted value, conditioned on the record's section flag.

The inherited option set is the base text widget's: a declared dynamic placeholder field, plus two keys read in the extractor and never declared, which control the dynamic placeholder machinery and its model reference. They work here because the descriptor is spread unchanged, though a title column in a list is an unlikely place to want them.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Same behavior on the development branch; the template is restructured and the icons change.
Odoo 19.0VerifiedVerified against the shipped source. Identical behavior to Odoo 18.
Odoo 18.0VerifiedIdentical behavior, including the section pencil.
Odoo 17.0VerifiedThis is where the section pencil and the descriptor registration were introduced.
Odoo 16.0Partial / changedOpen button only. No section pencil, and the component was registered directly so the inherited text options were unavailable.

Upgrade note. No XML change is needed between Odoo 16 and Odoo 19, but two things differ on Odoo 16. The pencil on section rows does not exist, and the widget registers its component class directly instead of a descriptor, which means the inherited text options are not available there. Both were fixed in Odoo 17, and Odoo 17, 18 and 19 behave identically.

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 and this may still change; we re-verify the page after release.

Behavior is unchanged, presentation is not. The template is restructured on the development branch: an intermediate template holds the two additions, the open button moves into the base widget's input-button area rather than an input group of its own, and both icons switch from the older icon font to Odoo's own icon set. The section pencil also becomes a real button element instead of a bare icon.

The dependency stands. The open action still goes through the same environment helper, and core still pairs the widget with the survey question list on that branch.

Common problems and fixes

SymptomCause and fix
The open button does nothingThe field is not inside the question_page_one2many widget, which is what publishes the open-record helper. Use the widget only inside that parent widget, or open the row by clicking it.
The pencil never appears on section rowsThe embedded list does not load the is_page field, and the widget declares no dependency on it. Add the field with column_invisible="True", or keep a decoration expression that references it.
The input and the button sit on separate linesThe layout class the widget adds to the input did not apply, usually because a custom template replaced the input. Remove the competing template override, or add the column class yourself.
Clicking the button also selects the rowA custom template dropped the click-stop on the button. Keep the click propagation stopped on the button, as the shipped template does.
The widget does nothing special on a formBoth features are list-oriented and one of them depends on the parent widget. Use the plain text widget on forms.
Missing widget error in the logThe survey module is not installed in that database. Install survey, or use char or text instead.

Survey title cell vs the alternatives

WidgetBest forKey difference
survey_description_pageThe title cell of a sectioned list that needs a way into the full recordText field plus an open-record button and a section pencil, both supplied by its template
charA plain single-line text cellNo button, no pencil and no dependency on a parent widget
textMulti-line textTextarea rendering, again with no added affordances
question_page_one2manyThe list this cell lives inThe container widget that publishes the open-record helper this one calls

If all you need is a text cell, use the plain char or text widget and let the row's own click handler open the record. This widget is worth the coupling only when the cell has to offer an explicit way in, and when its parent widget can publish the helper it depends on.

Frequently asked questions

What does survey_description_page add to a text field?+
Two things. In edit mode an open-record button beside the input, and in read mode a pencil icon on rows whose section flag is set. The stored value and its saving behavior are unchanged.
Why does the open button do nothing on my form?+
Because it calls a helper published into the environment by the question_page_one2many widget. Outside that container the helper does not exist and the click resolves to nothing.
Why is the section pencil missing?+
The pencil is conditioned on a field named is_page, read literally and with no declared field dependency. If the embedded list does not load it, the icon never renders.
Does it support any options?+
Only the ones it inherits from the base text widget, since it spreads that descriptor unchanged. Two of those keys, the dynamic placeholder pair, are read in the extractor without being declared anywhere.
Was it the same in Odoo 16?+
Not quite. Odoo 16 has the open button but no section pencil, and it registers the component class directly, which means the inherited text options are unavailable on that version.

Lists your team edits all day, one click too slow?

Cell-level affordances like an open button or a status hint are hours of work that save a minute a hundred times a day. We build them into the screens your team actually lives in, as part of Odoo customization on 16 through 19.

Book a free consultation

How this page was produced

The two template additions, the environment call and the literal use of the section flag were read from description_page_field.js and description_page_field.xml on the Odoo 19.0 branch, and the inherited option set from char_field.js in the same branch. The dependency on the parent widget was confirmed in question_page_one2many_field.js. Version differences come from the same files on 16.0, 17.0 and 18.0, and the Odoo 20 notes from the public development branch. Spotted an error? Tell us and we will correct the page.