Skip to main content
iVentureTeam

many2many_tags_placeholder_list_view

The tags widget with one thing changed: a template that shows a placeholder when the cell is empty, so a list column does not go blank.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 28, 20264 min read
Technical namemany2many_tags_placeholder_list_view
Field typesmany2many
Viewslist
Modulepoint_of_sale, the Point of Sale app
Used in coreTag columns in Point of Sale backend lists
VersionsOdoo 20.0, Odoo 19.0
No-code setupNo. It is set in view XML and depends on module-specific data
Alternativesmany2many_tags, many2many_tags_avatar, many2many

What the placeholder tags does

Tag columns in a list have an awkward empty state. A cell with no tags renders as nothing at all, which on a dense list is indistinguishable from a rendering fault, and gives the user nowhere obvious to click to add one.

This widget fixes that with a template. The tags themselves and everything about how they behave are inherited from the standard tags widget; the replacement template is what draws a placeholder when the cell is empty.

That is the entire difference. There is no extra option, no new prop and no behavioral change, which makes it one of the smallest widgets in Odoo and a good example of how far a template substitution goes.

What this means for your team

Empty states are the part of an interface that gets designed last and noticed first. A list column that goes blank teaches users that the data is unreliable, and a placeholder costs nothing to add.

The reusable lesson is that a great many widget requests are template requests. Before writing behavior, check whether replacing the template on an existing widget gets you there, because that keeps every inherited option working.

Supported options in Odoo 19

The widget declares no options of its own and spreads the tags widget's descriptor unchanged, so everything below is inherited and behaves normally. Read from the placeholder list view source, Odoo 19.0.

OptionTypeWhat it does
color_fieldfieldInherited from the tags widget and unaffected by the template substitution.
no_createbooleanInherited. Removes both creation paths from the dropdown.(default: false)
no_quick_createbooleanInherited. Removes creation from the typed text while keeping the popup form path.(default: false)
edit_tagsbooleanInherited. Makes clicking a tag open its record.(default: false)

Nothing is lost. Because the descriptor is spread without replacing the extractor, every option the tags widget accepts continues to work, which is not true of several other widgets that substitute a template and rewrite the extractor at the same time.

Working examples

The usual usage

<field name="tag_ids"
       widget="many2many_tags_placeholder_list_view"/>

Tags as usual, with a placeholder when the cell is empty.

With inherited options

<field name="tag_ids"
       widget="many2many_tags_placeholder_list_view"
       options="{'color_field': 'color', 'no_quick_create': True}"/>

Everything the tags widget accepts works, because the descriptor is spread unchanged.

The plain tags widget

<field name="tag_ids" widget="many2many_tags"/>

Identical behavior, with an empty cell showing nothing.

How far a template substitution goes

The file is under twenty lines. A subclass that names a different template, a descriptor that spreads the base and adds the standard tags styling class, and the registration.

The styling class matters more than it looks. Adding it keeps the cell visually consistent with other tag columns, which is what stops a replaced template from drifting away from the rest of the interface.

Because the extractor is not touched, the inherited options all continue to function. That is worth contrasting with several widgets elsewhere in Odoo that replace both the template and the extractor and silently lose everything the base would have read.

Everything visible about the placeholder itself, its wording and its styling, lives in the template rather than in this file.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Byte-identical to Odoo 19 on the development branch.
Odoo 19.0VerifiedFirst version. Verified against the shipped source.
Odoo 18.0Not availableWidget does not exist.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget is new in Odoo 19. On earlier versions the same columns used the plain tags widget, so an upgrade adds the placeholder with the standard views and nothing needs migrating.

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 this page after the release.

Byte-identical. The file on the development branch matches Odoo 19 exactly.

Common problems and fixes

SymptomCause and fix
No placeholder appearsThe cell is not empty, or the template was overridden. Check for a customization replacing the template.
The cell looks unlike other tag columnsThe standard tags styling class was removed. Keep the additional class the descriptor adds.
An inherited option stopped workingIt should not; the descriptor is spread and the extractor untouched. Check the option spelling against the tags widget.
Missing widget errorThe Point of Sale module is not installed in that database. Install it, or use the plain tags widget.
The placeholder text is wrong for my caseIt lives in the template rather than in an option. Copy the widget with your own template.
It renders oddly on a formThe template is written for a list cell. Use the plain tags widget on forms.

Placeholder tags vs the alternatives

WidgetBest forKey difference
many2many_tags_placeholder_list_viewTag columns in a list that should not go blank when emptyA replaced template only, so every inherited option keeps working
many2many_tagsTags anywhere elseAn empty cell shows nothing
many2many_tags_avatarTags representing peopleAvatars rather than a placeholder
many2manyA relation shown as a tableColumns rather than tags

The plain tags widget is right wherever the empty state does not matter, which on a form is usually the case because the label supplies the context. In a list column, a placeholder is worth the widget.

Frequently asked questions

What does this widget change?+
Only the template, which draws a placeholder when the cell is empty. Every behavior and every option is inherited from the tags widget unchanged.
Do the tags widget's options still work?+
Yes. The descriptor is spread and the extractor is not replaced, which is not true of several other widgets that substitute a template.
Where does the placeholder text come from?+
The template, not an option. Changing it means copying the widget with your own template.
Can I use it on a form?+
It will render, but the template is written for a list cell, so a form is better served by the plain tags widget.
Which versions have it?+
Odoo 19 onwards, and it is byte-identical on the Odoo 20 development branch.

Empty states that do not look like bugs

Blank cells, missing placeholders and unexplained gaps are the small things that make users distrust a system. We review and fix those details across Odoo screens, on versions 16 through 19.

Book a free consultation

How this page was produced

The template substitution, the added styling class and the unchanged descriptor were read from the placeholder list view source on the Odoo 19.0 branch, with the inherited option set read from the tags field in web. Version coverage comes from the absence of the file on 16.0, 17.0 and 18.0, and a byte comparison against the public development branch. Spotted an error? Tell us and we will correct the page.