badges_many2one
New capability in Odoo 20, not a rename. It turns a many2one into a row of clickable badges, can put a different icon on each one, and keeps working when the connection drops.
September 18, 2026Updated September 18, 20265 min read
| Technical name | badges_many2one |
|---|---|
| Field types | many2one |
| Views | form, list |
| Module | web, present in every Odoo 20 database |
| Used in core | 32 uses across Odoo 20 Community and Enterprise views, excluding tests. Does not exist in Odoo 19. |
| Versions | Odoo 20.0 |
| No-code setup | No Studio entry, though all three of its options are properly declared. |
| Alternatives | badges_selection, many2one, many2one_avatar, radio |
What the badges_many2one widget does
What this means for your team
Supported options in Odoo 20
| Option | Type | What it does |
|---|---|---|
badge_limit | number | Displays a dropdown once the badge count is higher than this value. Worth setting on any relation that can grow, since the widget loads all candidates.(default: 0, meaning unlimited)(since Odoo 20.0) |
related_icon_field | field name on the co-model | Name of a field on the TARGET model holding an icon class, so each record shows its own icon. Setting it changes the loading strategy from name_search to search_read so the icon arrives with the name.(since Odoo 20.0) |
default_icon | string | Fallback icon class used when a record's related_icon_field is empty. Also usable on its own to give every badge the same icon.(since Odoo 20.0) |
related_icon_field names a field on the co-model, not on the record carrying the many2one. When it is set, the widget changes how it loads candidates, using search_read with that field included rather than name_search, so the icon is available before a badge is drawn. default_icon covers records where that field is empty.
Working examples
What happens when the connection drops
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 19.0 | Not available | Does not exist. Odoo 19 has no badge widget for many2one fields. |
| Odoo 20.0 | Verified | Introduced in Odoo 20. Verified against the shipped 20.0 source. |
This widget does not exist before Odoo 20.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| Only one badge shows and nothing can be selected | The candidate query failed on a lost connection, so the widget fell back to displaying just the current value. Expected offline behavior. It recovers when the connection returns. |
| Icons do not appear | related_icon_field names a field that does not exist on the target model, or is empty on those records. Check the field exists on the co-model. Set default_icon as a fallback. |
| The form is slow to open | The widget loads every candidate record when the field renders, not on demand. Narrow with a domain, set badge_limit, or use the ordinary many2one for a large relation. |
| A user cannot clear the value | Deselection is derived from the field's required state rather than from an option. Make the field non-required if clearing should be possible. |
Badges_many2one widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
badges_many2one | A small, stable relation people pick from constantly | Badge picker for a many2one, with per-record icons and an offline fallback |
| badges_selection | The same interface for a selection field | Choices come from a selection list rather than a model |
| many2one | A relation with many records | Loads on demand rather than eagerly |
| many2one_avatar | Relations to people | Shows a photo rather than a badge and icon |
| radio | A short relation as radio buttons | Different visual language, no icons |
Frequently asked questions
Can I show an Odoo many2one field as badges?+
How do I put a different icon on each badge?+
What happens if the connection drops?+
Is badges_many2one suitable for a large relation?+
Forms where every choice is two clicks too many?
Odoo 20 adds real badge pickers for relations, but they load eagerly and turn into a performance problem on the wrong field. We know which fields earn them and configure the rest properly.
Talk to an Odoo consultant