Skip to main content
iVentureTeam

many2one_tags_skills

A one-to-many rendered as clickable tags, with its own Select Skills dialog. Its registered name says many2one, its class says one2many, and the class is right.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 27, 20265 min read
Technical namemany2one_tags_skills
Field typesone2many
Viewsform
Modulehr_skills, employee skills
Used in coreSkills fields rendered as tags in hr_skills
VersionsOdoo 20.0, Odoo 19.0
No-code setupNo. It is set in view XML and depends on module-specific data
Alternativesmany2many_tags_skills, one2many, skills_one2many, many2many_tags

What the skills tag list does

Skills on an employee are child records: each one pairs a skill with a level and a type. Rendered as a table they take a block of the form; rendered as tags they take a line, which is usually the right trade on a profile.

This widget does that. It takes a child list and draws it as tags, each one clickable to open the underlying record in a dialog, with a delete action when the field is editable.

The name is misleading and worth flagging: the registration says many2one, while the class, the file and the behavior are all about a one-to-many. The name is what you write in a view, so it has to be used as-is, but it describes nothing about what the widget does.

What this means for your team

Profile screens are a competition for vertical space, and skills are exactly the kind of data that is important to see and rarely edited in bulk. Tags give the overview; the dialog gives the detail when someone actually wants to change a level.

The pattern is reusable for any child list that is read far more often than it is edited: render compactly, open on demand. What is not reusable here is the widget itself, because its dialog title and template are specific.

Supported options in Odoo 19

The widget declares no supported options, and neither does the descriptor it spreads: the options dictionary is forwarded to the embedded view. What it does define itself is the tag rendering, described below. Read from the one-to-many tags skills source, Odoo 19.0.

OptionTypeWhat it does
colorfield on the child recordRead when building each tag's properties and used as the tag color index.(since Odoo 19.0)
widgetstring (attribute)Compared against the many-to-many name to decide whether an opened record carries a reference back to its parent.(since Odoo 19.0)
editablestring (list attribute)Set on the embedded view. Governs whether the delete handler is attached to each tag.

The tag properties are built from scratch. Rather than extending the base tag properties, the widget defines the identifier, text, color, edit flag and both handlers itself. That means anything the base tag would normally contribute is absent unless this widget adds it.

Working examples

The usual usage

<field name="employee_skill_ids"
       widget="many2one_tags_skills"/>

The name is the registered one, despite the relation being a one-to-many.

What a tag carries

text        # the record's display name
colorIndex  # from the record's color field
onClick     # opens the record in a dialog
onDelete    # only when the field is editable

All defined by the widget rather than inherited.

A full list instead

<field name="employee_skill_ids">
  <list editable="bottom"> ... </list>
</field>

A table, which is right where levels are edited in bulk.

A name that describes nothing it does

Three things are defined in this widget rather than inherited, and each is worth knowing.

The tag properties are built from scratch: identifier, record identifier, text from the display name, color from the record's color field, an edit flag, a click handler that opens the record and a delete handler that only exists when the field is editable. Nothing is spread from a base, so nothing else appears on the tag.

The record opening is wrapped so that the dialog's title is set before delegating. That title is a fixed string naming skills, which is the clearest sign the widget is not general purpose even though its behavior would otherwise be.

And whether the opened record carries a reference back to its parent is decided from the widget attribute on the field, comparing it against the many-to-many name. That is how the same code serves both relation kinds, and it is the only place the many2one in the registered name has any echo at all.

One more oddity: the template it points at belongs to the recruitment skills module's namespace although the file ships in the skills module, so the two modules are coupled more tightly than the file layout suggests.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Reworked alongside the tag components.
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, so there is nothing to migrate from earlier versions. Its template lives in another module's namespace, which is worth remembering if you install the skills modules selectively.

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.

Reworked alongside the tag components. The development branch changes this widget with the wider rework of how tags are built. The concept, a child list rendered as clickable tags with a dialog, is what to expect to survive.

Common problems and fixes

SymptomCause and fix
Tags cannot be deletedThe field is read-only, and the delete handler is only attached when it is editable. Expected. Make the field editable if removal is wanted.
The dialog title says Select Skills on another modelThe title is a fixed string set by the widget. Copy the widget with your own title if reusing it.
Tags have no colorThe child record has no color field, or it is unset. Add and populate that field on the child model.
The widget name looks wrongThe registration says many2one while the behavior is one-to-many. Use the registered name as written; it is the only name that resolves.
A template error appearsThe template belongs to the recruitment skills module's namespace. Make sure the module providing that template is installed.
Options are ignoredThe widget declares none and forwards the dictionary to the embedded view. Use the view's own attributes instead.

Skills tag list vs the alternatives

WidgetBest forKey difference
many2one_tags_skillsOwned child records shown compactly and edited in a dialogBuilds its tag properties itself and fixes the dialog title, despite a name that says many2one
many2many_tags_skillsSkills as a many-to-many of tagsA relation of simple records, with an injected level flag
one2manyChild records edited in placeA table rather than tags
skills_one2manySkills as a full listThe tabular presentation of the same data
many2many_tagsAny relation as tagsStandard tag properties, no dialog title of its own

Use a plain child list where the records are edited in place, and the tags widget where the relation is a many-to-many of simple records. This widget occupies the middle ground: owned children shown compactly and edited in a dialog.

Frequently asked questions

Why does the name say many2one?+
It is simply the registered name. The class, the file and the behavior are all about a one-to-many, and the name has to be used as written because that is what resolves.
Where do the tag properties come from?+
The widget builds them itself rather than extending a base, so the text, color, edit flag and both handlers are all defined in this file.
Why does the dialog say Select Skills?+
The title is a fixed string set by the widget before delegating to the standard record opening, which is what makes it specific rather than general purpose.
Can I delete a tag?+
Only when the field is editable. The delete handler is attached conditionally on that.
Which versions have it?+
Odoo 19 onwards. The development branch reworks it alongside the wider tag component changes.

Employee profiles that stay readable as they fill up

Skills, certifications and history all compete for the same form, and the layout decides whether any of it is maintained. We design Odoo HR screens around what your team actually updates, on versions 16 through 19.

Book a free consultation

How this page was produced

The self-built tag properties, the fixed dialog title, the parent reference decided from the widget attribute and the cross-module template namespace were read from the one-to-many tags skills source on the Odoo 19.0 branch. Version coverage comes from the absence of the file on 16.0, 17.0 and 18.0, and a comparison against the public development branch. Spotted an error? Tell us and we will correct the page.