Skip to main content
iVentureTeam

many2many_tags_color_dot

New in Odoo 20. It renders tags as a colored dot next to a plain label rather than a filled pill, and it overrides the parent widget's click behavior through an option nobody declares.

September 18, 2026Updated September 24, 20264 min read
Technical namemany2many_tags_color_dot
Field typesmany2many
Viewsform, list
Moduleweb, present in every Odoo 20 database
Used in core11 uses across Odoo 20 Community and Enterprise views, excluding tests. Does not exist in Odoo 19.
VersionsOdoo 20.0
No-code setupNo Studio entry of its own. It inherits the Tags widget's options, which Studio does expose.
Alternativesmany2many_tags, many2many_tags_avatar, many2many_checkboxes

What the many2many_tags_color_dot widget does

The standard Tags widget renders each tag as a filled pill. On a dense form that is a lot of color competing with the rest of the screen. This widget keeps the color as information but demotes it visually: a small dot carries the color, and the label sits next to it as ordinary text.

It is a thin subclass. The descriptor spreads many2ManyTagsField, so every option the Tags widget supports, including the new Odoo 20 tag_limit and on_tag_click, is available here too.

The one behavior it adds for itself is how clicking a tag is handled, and that is where the interesting part is.

What this means for your team

This is a readability decision. Tag colors are useful for grouping at a glance and terrible when a record has eight of them and the form turns into a paint chart.

Dots keep the grouping signal and give the page back its hierarchy. On a record where tags are secondary information rather than the point of the screen, that is usually the right trade.

Supported options in Odoo 20

Everything many2many_tags supports, inherited through the descriptor spread, plus one option this widget reads and never declares.

OptionTypeWhat it does
can_openboolean<strong>Undocumented: declared nowhere.</strong> When truthy, clicking a tag opens its record. The widget deletes the inherited onTagClick and sets it to open_form only when this is set, so without it a tag click does nothing.(default: false)(since Odoo 20.0)
color_fieldfield nameInherited from many2many_tags. Names an integer field on the tag model holding the color index, which is what gives each dot its color. Without it every dot renders the same.
tag_limitnumberInherited from many2many_tags and new in Odoo 20. Shows a counter once the tag count passes this value. Pairs well with dots on a crowded record.(default: 0, meaning show all)(since Odoo 20.0)

Note the interaction with the parent's own click option. In Odoo 20, many2many_tags gained on_tag_click, replacing the Odoo 19 pair of edit_tags and no_edit_color. This widget deletes whatever that produced before applying its own, so setting on_tag_click here has no effect. Use can_open instead.

Working examples

Dots with colors from an integer field on the tag model:

<field name="tag_ids" widget="many2many_tags_color_dot"
       options="{'color_field': 'color'}"/>

Making a tag click open the tag record, through the undocumented option:

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

This is ignored, because the widget discards the inherited value:

<!-- on_tag_click is deleted before this widget sets its own -->
<field name="tag_ids" widget="many2many_tags_color_dot"
       options="{'on_tag_click': 'edit_color'}"/>

An option that overrides its own parent

The whole addition is five lines:

extractProps({ attrs, options, string, placeholder }, dynamicInfo) {
    const props = many2ManyTagsField.extractProps(
        { attrs, options, string, placeholder }, dynamicInfo
    );
    delete props.onTagClick;
    if (options.can_open) {
        props.onTagClick = "open_form";
    }
    return props;
}

Read the order carefully. It runs the parent's extraction, then unconditionally deletes onTagClick, then sets it again only if can_open is truthy.

Two consequences. First, can_open is a real option that appears in no option list, no documentation and no Studio panel, because this widget declares no supportedOptions of its own and inherits the parent's list, which does not mention it.

Second, the parent's on_tag_click option is unreachable here. Whatever you set, the delete removes it. So the Odoo 20 ability to make a tag click open the color editor, which many2many_tags supports, cannot be used with color dots. Given that the dot is the color, that is a defensible design decision, but it is not one you would discover from the options list.

By default, with can_open unset, clicking a tag does nothing at all.

Version compatibility

VersionStatusNotes
Odoo 19.0Not availableDoes not exist. The nearest equivalent is many2many_tags with colors, which renders filled pills.
Odoo 20.0VerifiedIntroduced in Odoo 20. Verified against the shipped 20.0 source.

This widget does not exist before Odoo 20.

What is changing in Odoo 20

Introduced in Odoo 20. Odoo 19 has no color dot variant, so the closest equivalent there is the plain Tags widget with colors, which renders filled pills.

It arrives in the same release where many2many_tags itself changed noticeably: edit_tags and no_edit_color were replaced by a single on_tag_click selection, and a tag_limit option was added that shows a counter past a threshold. Because this widget spreads the parent descriptor, tag_limit works here, and it pairs well with dots on a crowded record.

Common problems and fixes

SymptomCause and fix
Every dot is the same colorNo color_field is set, or the named field is not an integer on the tag model. Add options="{'color_field': 'color'}" and confirm the field exists on the related model.
Clicking a tag does nothingDefault behavior. The widget deletes the inherited click handler and only restores it when can_open is set. Add options="{'can_open': True}".
on_tag_click has no effectThis widget deletes the prop the parent's option produces before setting its own. Use can_open instead. The parent's click modes are not reachable here.
can_open does not appear in StudioIt is declared nowhere; the widget inherits the parent's option list, which does not mention it. Set it in the view XML. It works despite being undocumented.

Many2many_tags_color_dot widget vs the alternatives

WidgetBest forKey difference
many2many_tags_color_dotTags that are context rather than the point of the screenColored dot plus plain label, with an undocumented can_open that overrides the parent
many2many_tagsTags as primary informationFilled pills, and its on_tag_click option actually works
many2many_tags_avatarTags that represent peopleShows avatars rather than dots
many2many_checkboxesA short fixed set shown in fullEvery option visible, no colors

Use many2many_tags when the tags are the point of the screen and full pills help people find them. Use this one when tags are context rather than content. If crowding is the real problem, tag_limit on either widget solves it more directly than changing the visual style.

Frequently asked questions

How do I make a tag clickable with many2many_tags_color_dot?+
Set options="{'can_open': True}". That option is undeclared and appears in no option list, but the widget reads it and sets the tag click to open the record. Without it, clicking does nothing.
Why does on_tag_click not work on this widget?+
Because extractProps runs the parent's extraction and then deletes onTagClick before optionally setting its own value from can_open. Whatever the parent produced is discarded.
Where do the dot colors come from?+
From the inherited color_field option, which names an integer field on the tag model holding the color index. Without it every dot renders the same.
Does this widget exist in Odoo 19?+
No, it is new in Odoo 20. The nearest Odoo 19 equivalent is many2many_tags with a color field, which renders filled pills rather than dots.

Forms that look like a paint chart?

Tag colors stop being informative the moment everything has one. We rework crowded Odoo forms so color carries meaning again, using what Odoo 20 added rather than piling on custom CSS.

Book a free consultation

How this page was produced

Verified by reading addons/web/static/src/views/fields/many2many_tags_color_dot/many2many_tags_color_dot_field.js on the 20.0 branch of a local clone of the official Odoo repository, with extractProps quoted in full above. The inherited option list comes from the parent descriptor in views/fields/many2many_tags/many2many_tags_field.js on the same branch, where on_tag_click and tag_limit are declared. The usage count comes from scanning every non-test XML file in Community, Enterprise and odoo/addons. Corrections welcome via our contact page.