Skip to main content
iVentureTeam

many2one_avatar

The generic avatar dropdown: a standard many2one with the linked record's picture in front of its name. Same options as many2one, plus one opening rule of its own.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 11, 2026Updated August 11, 20267 min read
Odoo 19 form view showing a many2one field rendered by the many2one_avatar widget, with the linked record's round avatar image displayed in front of its name in the dropdown input.
Technical namemany2one_avatar
Field typesmany2one
Viewsform, list, kanban
Also registered askanban.many2one_avatar
Moduleweb, present in every Odoo database
Used in core32 occurrences across 12 modules, including fleet, website, marketing_card, crm, im_livechat, lunch
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo documented Studio path for this widget; it is set in view XML. Studio's Many2One toggles map to the same options it reads
Alternativesmany2one, many2one_avatar_user, many2one_avatar_employee, many2many_tags_avatar

What the Avatar dropdown does

A plain many2one shows a name. When the linked record is a person, a vehicle, or anything users recognize by sight faster than by text, a name alone wastes the strongest cue available. The Avatar dropdown fixes that: it renders the standard many2one input with the linked record's round avatar image directly in front of the name, and shows the same avatars inside the autocomplete list while searching.

The widget is deliberately thin. In the Odoo 19 source it is a small component that composes the standard many2one through buildM2OFieldDescription, so searching, creating, opening and barcode scanning all behave exactly like the base many2one. What it adds is the image, read from /web/image/<model>/<id>/avatar_128, and one opinion about when clicking the value should open the linked record.

Unlike many2one_avatar_user and many2one_avatar_employee, this base version carries no user presence, no avatar card popover and no assign-to-me commands. That is what makes it the right choice for non-user models: core uses it for fleet drivers, lunch suppliers and livechat operators alike.

What this means for your team

Assignment mistakes are recognition mistakes. When a dispatcher picks the wrong driver or a coordinator books the wrong contact person, it is usually because two similar names sat next to each other in a dropdown. Faces remove that ambiguity at a glance, which is why every serious CRM shows people as pictures, not strings.

The practical payoff shows up in list views. A column of avatars scans in a fraction of the time a column of names does, and misassignments become visible without reading. Teams that switch their high-traffic list views from plain many2one to avatar widgets consistently report catching wrong assignments earlier, simply because the wrong face jumps out.

The one decision to make consciously is the opening behavior. By default the value is clickable through to the linked record only on forms, which keeps list navigation fast. If your team expects to jump from a list cell to the record, that is a one-option change, and in Odoo 19 it finally works on this widget.

Supported options in Odoo 19

Verified against many2one_avatar_field.js and the shared many2one_field.js descriptor in the Odoo 19.0 web module. The widget declares no options of its own; everything below is inherited from the standard many2one, except the no_open row, whose default this widget changes.

OptionTypeWhat it does
no_openbooleanControls click-through to the linked record. Absent: opening works only in form views. Present: the explicit value wins everywhere, so no_open: False forces opening even in list cells. This default rule is specific to the avatar widget.(default: open in form views only)
no_createbooleanRemoves record creation from the dropdown entirely. Overrides no_quick_create and no_create_edit, and also disables the can_create view attribute path.
no_quick_createbooleanRemoves the inline entry that creates a record from the typed text. Creation through the popup form stays available.
no_create_editbooleanRemoves the Create and Edit entry that opens a popup form. Inline creation from typed text stays available.
search_thresholdnumberMinimum characters typed before the search query fires. Without it, the dropdown searches on focus, one query per click on large tables.
placeholder_fieldfield nameA char field on the current record supplying a dynamic placeholder while the field is empty.
can_scan_barcodebooleanEnables barcode scanning to fill the field on mobile. Read in the shared extractProps; it appears in no options panel or documentation.
create_name_fieldfield nameWhich field on the related model receives the typed text on inline creation. Undocumented; read in the shared extractProps.(default: name)

no_open behaves differently here than on a plain many2one. On many2one the default is open-on-click everywhere. On many2one_avatar the source reads the option explicitly: if no_open is present it wins in either direction, and if it is absent, opening is enabled only when the view is a form. Setting options="{'no_open': False}" is therefore meaningful on this widget: it forces click-to-open even in list cells.

Working examples

Basic avatar dropdown

<field name="driver_id" widget="many2one_avatar"/>

The related model must expose avatar_128. Models built on Odoo's avatar mixin, including contacts, users and employees, all do.

Clickable through to the record, even in lists

<field name="driver_id"
       widget="many2one_avatar"
       options="{'no_open': False}"/>

Explicitly declaring the option overrides the form-only default, an Odoo 19 behavior.

Locked-down picker for a controlled list

<field name="operator_id"
       widget="many2one_avatar"
       options="{'no_create': True, 'search_threshold': 2}"/>

No creation from the dropdown, and no search query until two characters are typed, which is worth setting on large partner tables.

The avatar_128 contract and other source details

Three source-level details are worth knowing before you rely on this widget.

The image field is hardcoded. The template builds /web/image/<relation>/<id>/avatar_128. There is no option to point it at another image field. If the related model lacks avatar_128, you get broken image requests, so custom models need Odoo's avatar mixin (image.mixin plus the avatar fields, the pattern res.partner uses) rather than a bare binary field.

Permission attributes pass through. Because the widget reuses the shared many2one extractProps, the view attributes can_create and can_write are evaluated as expressions and gate creation and editing, on top of the option-based switches. The undocumented options can_scan_barcode and create_name_field pass through the same way.

The kanban variant is registered separately. kanban.many2one_avatar renders a compact template, adds the o_field_many2one_avatar_kanban class, and passes the record's readonly state through. Odoo resolves it automatically when the field sits inside a kanban card; you never write the prefixed name in XML.

When the field is empty and editable, the template renders an empty avatar placeholder circle; when it is empty and readonly, it renders nothing at all. A list column of records without values therefore looks completely blank rather than showing gray circles.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The development branch adds write_date cache busting and renames the kanban variant to card.many2one_avatar; see below.
Odoo 19.0VerifiedAll options in the table verified against the shipped source.
Odoo 18.0Partial / changedWidget present with the same registrations, but no_open is ignored: opening is hardcoded to form views only.
Odoo 17.0VerifiedWidget present with the same registry name. Not re-verified line by line for this page.
Odoo 16.0VerifiedWidget present with the same registry name. Not re-verified line by line for this page.

Upgrade note for 18 to 19. In Odoo 18 this widget forced its form-only opening rule and ignored no_open entirely; in 19 an explicit no_open wins. If your 18 views carry no_open on avatar fields expecting it to do nothing, review them during an Odoo migration, because in 19 the option now takes effect.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. We read this widget's file on the public development branch at the time of writing; the branch is unstable, so treat the following as direction rather than a released behavior, and we re-verify after launch.

Two changes are visible. First, the widget declares write_date as a related field, which cache-busts the avatar URL so a changed profile picture shows up immediately instead of after a browser cache expiry, the same fix many2one_avatar_user received earlier. Second, the kanban variant is renamed from kanban.many2one_avatar to card.many2one_avatar as part of a repo-wide move of kanban-prefixed registrations to a card prefix. XML does not reference the prefixed names, so views are unaffected, but JavaScript patches against the kanban variant will need the new name.

Common problems and fixes

SymptomCause and fix
Broken image icon instead of an avatarThe related model has no avatar_128 field, so the /web/image request 404s. Add Odoo's avatar mixin to the model, or use a plain many2one instead.
Clicking the value does nothing in list viewDefault behavior: opening is enabled only in form views. Set options="{'no_open': False}" to force opening everywhere (Odoo 19).
no_open has no effect on Odoo 18The 18 version of this widget overwrites the option with its own form-only rule. Accept the default on 18, or upgrade; Odoo 19 honors the option.
Avatar does not update after changing the pictureThe browser caches the avatar URL. Hard-refresh. The Odoo 20 development branch adds write_date cache busting for exactly this.
Users create duplicate records from the dropdownInline quick-create is enabled by default. Set no_create for a closed list, or no_quick_create to force the full creation form.
Empty rows show nothing at all in the avatar columnExpected: with no value and readonly rendering, the template outputs nothing. No fix needed; the empty placeholder circle appears only while editing.

Avatar dropdown vs the alternatives

WidgetBest forKey difference
many2one_avatarAny many2one to a model with avatars, beyond users and employeesAdds the avatar_128 image to the standard dropdown, with form-only opening by default
many2oneRelations where a name is enoughSame behavior without the image, and opens on click in every view by default
many2one_avatar_userFields pointing at res.users, such as AssigneeAdds the avatar card popover and assign-to commands on top of the image
many2one_avatar_employeeHR screens pointing at employeesSwitches between public and private employee data based on HR access rights
many2many_tags_avatarSeveral linked records with avatarsRenders a many2many as avatar pills instead of a single dropdown

The rule of thumb: reach for the specialized user and employee variants when the relation is res.users or hr.employee, because they add presence, avatar cards and assignment commands. Use this base widget for every other model with an avatar.

Frequently asked questions

What does the many2one_avatar widget do in Odoo?+
It renders a many2one field as the standard searchable dropdown with the linked record's avatar image shown in front of the name, both in the field itself and inside the autocomplete suggestions. It stores nothing extra; the underlying field is a normal many2one.
Why is my avatar showing as a broken image?+
The widget always loads /web/image/<model>/<id>/avatar_128. If the related model does not have an avatar_128 field, that URL returns nothing. Custom models need Odoo's avatar mixin, the same mechanism contacts and users use, rather than a plain binary image field.
Can I choose which image field the avatar comes from?+
No. The field name avatar_128 is hardcoded in the template in Odoo 19, and there is no option to change it. If your image lives elsewhere, add a computed avatar_128 on the model or use a different widget.
Why does clicking the value open the record on the form but not in the list?+
That is the widget's own default: opening is enabled only when the view is a form. In Odoo 19 you can override it by setting options="{'no_open': False}", which forces click-to-open everywhere. In Odoo 18 the option was ignored on this widget.
Does many2one_avatar support the same options as many2one?+
Yes. It composes the standard many2one descriptor, so no_create, no_quick_create, no_create_edit, search_threshold and placeholder_field all work, plus the undocumented can_scan_barcode and create_name_field pass-throughs and the can_create and can_write view attributes.
When should I use many2one_avatar_user instead?+
Whenever the relation is res.users. The user variant adds an avatar card popover with contact details and the assign-to command palette entries, none of which exist on this base widget. Use the base widget for non-user models such as vehicles, suppliers or livechat operators.
Will many2one_avatar change in Odoo 20?+
The development branch shows two changes: avatar URLs gain write_date cache busting so picture changes appear immediately, and the kanban variant is renamed from kanban.many2one_avatar to card.many2one_avatar. Nothing changes in view XML. Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026, and we re-verify after release.

Want faces on your records, not just names?

Avatar fields on custom models need the avatar mixin wired in correctly, and the open, create and search options tuned per view. We do this kind of precise view and model work daily, for Odoo 16 through 19 databases.

Book a free consultation

How this page was produced

Every option in the table was read from the Odoo 19.0 web module source, in many2one_avatar_field.js and the shared many2one_field.js descriptor it composes, and the template was inspected to confirm the avatar_128 URL and the empty-value rendering. The Odoo 18 comparison was read from the 18.0 branch of the same file, and the Odoo 20 section from the public development branch, clearly marked as unreleased. Spotted an error or a version difference? Tell us and we will correct the page.