Skip to main content
iVentureTeam

many2many_avatar_user

The Assignees field on project tasks is this widget: user avatars as pills, an avatar card on click, and a kanban quick-assign popover that saves the record instantly.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 11, 2026Updated August 11, 20267 min read
Technical namemany2many_avatar_user
Field typesmany2many, one2many
Viewsform, list, kanban, activity
Also registered askanban.many2many_avatar_user, list.many2many_avatar_user, activity.many2many_avatar_user
Modulemail, installed with Discuss in every practical database
Used in core24 occurrences across 8 modules, including project, project_todo, im_livechat, mail, hr_recruitment, mail_group
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupPartial. Studio's Many2Many toggles cover creation and domain; the avatar widget itself is set in view XML
Alternativesmany2many_tags, many2many_tags_avatar, many2many_avatar_employee, many2one_avatar_user

What the User avatars field does

Assignment fields answer one question at a glance: who is on this? This widget renders a many2many pointing at users as a row of round avatar pills, and it is what Odoo itself uses for Assignees on tasks, to-dos and recruitment stages.

Under the hood, the Odoo 19 source builds it as a layered widget: it extends the generic many2many_tags_avatar, which itself spreads the many2many_tags descriptor, then mixes in a user-specific chatter layer. That layering is why it inherits every tags option, and why it adds three user-only behaviors: an avatar card popover when you click a face, automatic assign-to commands in the command palette on form and list views, and a specialized autocomplete for picking users.

Four registrations cover the view types, and each renders differently: full pills with names on forms, compact avatars in lists and kanban cards, and the same compact treatment in the activity view.

What this means for your team

Who-is-on-what is the single most-read piece of information on a project board. Avatars make it readable from across the room, and misassignments jump out in a way names in a column never do. That is the display half.

The workflow half is the kanban quick assign. Managers reassign work directly on the board: click the assign avatar on a card, pick people in the popover, done. Two properties of that flow, both verified in the source, matter operationally. Every change saves the record immediately, so there is no draft state and no accidental discard, and reassignments land in real time. And the popover deliberately blocks creating new users, so nobody accidentally invents an account while typing a name mid-assignment.

One sizing rule to plan around: kanban cards show three avatars before collapsing the rest behind a counter, lists five. On teams where six people genuinely share a task, the counter is what users will see, and hovering or opening the record is how they see everyone.

Supported options in Odoo 19

Verified through the descriptor chain in the Odoo 19.0 source: this widget spreads many2many_tags_avatar, which spreads many2many_tags, so the base tags options below apply verbatim. The form-only color options of the tags widget, no_edit_color and edit_tags, belong to the form-specific tags variant, which this widget does not inherit from.

OptionTypeWhat it does
no_createbooleanInherited from many2many_tags. Removes user creation from the picker entirely, overriding the two options below. The kanban quick-assign popover blocks creation regardless.
no_quick_createbooleanInherited. Removes inline creation from typed text; the popup creation form stays.
no_create_editbooleanInherited. Removes the popup creation form; inline creation stays.
createdomainInherited. Domain expression enabling creation conditionally against the current record.
search_thresholdnumberInherited. Minimum characters before the user search fires; without it the dropdown queries on focus.
placeholder_fieldfield nameInherited. Char field on the record supplying a dynamic placeholder while empty.
create_name_fieldfield nameInherited and undocumented. Which field receives typed text on inline creation; read in the tags extractProps.(default: name)
color_fieldfield nameInherited from the tags descriptor and accepted, but avatar pills are image-driven; the tags color mechanics are not the point of this widget.

Two behaviors are automatic, not options. The assign-to command palette integration switches on whenever the view is a form or a list, read from the avatar base's extractProps, and the avatar card popover appears only when the related model is res.users or res.partner, read from the chatter mixin. Neither can be toggled from XML in 19.

Working examples

The Assignees pattern

<field name="user_ids" widget="many2many_avatar_user"/>

On forms and lists this also registers the assign commands in the command palette.

Restricted to existing users, delayed search

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

Inherited tags options at work: no user creation from the field, and no query until two characters are typed, which matters on databases with thousands of users.

Scoped to project members via domain

<field name="user_ids"
       widget="many2many_avatar_user"
       domain="[('share', '=', False)]"/>

The standard field domain filters the picker, here to internal users only.

Variant rules: list names, instant-save popover, gated avatar cards

The variant behavior is where the source gets interesting.

List cells decide when to show names. The list variant renders avatar plus name only when the field holds exactly one user or the row is being edited; with several users it collapses to faces only, keeping columns narrow. The kanban variant goes further: names appear only while editing. Both rules are explicit getters in the source.

The kanban popover is a different editing model. Clicking quick-assign opens a popover running a popover-specific subclass whose update and delete paths call record.save() immediately after each change. It also opens with creation fully disabled, quick create and create-and-edit included, and a Search users placeholder. So board-side assignment is instant and closed, while form-side assignment follows the normal edit flow and honors your creation options.

The avatar card is relation-gated. The mixin shows the card popover only for res.users and res.partner relations, one card at a time. Point the widget at another model and clicking a face does nothing, with no error.

The activity view reuses the kanban descriptor. activity.many2many_avatar_user is registered with the kanban variant, so activity cells behave exactly like kanban cards, quick assign included.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Development branch renames the kanban variant to card., adds write_date cache busting and a tagLimit prop; see below.
Odoo 19.0VerifiedVerified against the shipped source across the full descriptor chain.
Odoo 18.0VerifiedSame four registrations verified in the 18.0 source. Internals differ; XML is identical.
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 16 to 19. XML carries over unchanged, and the four registrations are stable across 18 and 19. JavaScript customizations are the risk area: the tags list subcomponents this widget wires together were reshaped between releases, so patches against its internals deserve a re-test on every migration.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The following reads the widget and its bases on the public development branch, which is unstable until feature freeze; we re-verify after release.

Four movements are visible. The kanban registration is renamed: kanban.many2many_avatar_user becomes card.many2many_avatar_user, part of the repo-wide kanban-to-card prefix rename, and the activity registration now points at that card variant. Avatar URLs gain write_date cache busting through the base widget, so changed profile pictures show immediately. The visible-avatar caps move into a tagLimit prop with new defaults, 2 on cards and 5 in lists, with the popover showing all while editing. And the tag and avatar card components are rebuilt, AvatarCardPopover becomes AvatarCard, click handlers change name, so JavaScript patches against 19 internals will not survive unedited. View XML is untouched by all of this.

Common problems and fixes

SymptomCause and fix
Clicking an avatar does not open the user cardThe card popover is gated to res.users and res.partner relations. Expected on other models; use the generic many2many_tags_avatar there.
Kanban shows a +N counter instead of everyoneThe kanban variant caps visible avatars at three before collapsing. Expected; open the record or use the quick-assign popover to see all.
Assignments from the board saved without confirmationThe quick-assign popover saves the record after every change, by design. Train for it; there is no draft state in that flow.
Cannot create a user from the kanban popoverThe popover hardcodes creation off, independent of your options. Create users from Settings; the block is deliberate.
Names missing next to avatars in list viewThe list variant shows names only for a single user or while editing. Expected; hover tooltips carry the names.
User search is slow on a huge user tableThe dropdown queries on focus by default. Set search_threshold: 2 so typing starts the search.
JS patch on the kanban variant broke on the Odoo 20 branchkanban.many2many_avatar_user is renamed to card.many2many_avatar_user and internals were rebuilt. Re-target the card. name and re-test after release.

User avatars field vs the alternatives

WidgetBest forKey difference
many2many_avatar_userAssignee and follower fields pointing at res.usersAvatar pills plus user card popover, assign commands and an instant-save kanban popover
many2many_tagsNon-people relations: tags, categories, labelsText pills with optional colors, no avatars or user behaviors
many2many_tags_avatarAvatar pills on models other than usersSame avatar rendering without the user card, commands or user autocomplete
many2many_avatar_employeeHR screens assigning employeesTargets hr.employee and switches data source by HR access rights
many2one_avatar_userExactly one responsible userSingle-value dropdown with the same user avatar treatment

The rule: this widget is for res.users. Employees get the employee variant with its HR access switching, and non-people relations belong to the generic avatar tags or plain tags.

Frequently asked questions

What is the many2many_avatar_user widget in Odoo?+
It renders a many2many field pointing at users as round avatar pills, and is the widget behind Assignees on project tasks. On top of the avatars it adds a user card popover on click, assign-to commands in the command palette on form and list views, and a kanban quick-assign popover.
Does it support the same options as many2many_tags?+
Yes. The source builds it by spreading the tags descriptor through the avatar base, so no_create, no_quick_create, no_create_edit, create, search_threshold, placeholder_field and the undocumented create_name_field all apply. The form-only tags color options are the one exception, since they live on a variant this widget does not inherit from.
Why does assigning from the kanban board save immediately?+
The quick-assign popover runs a popover-specific subclass whose update and delete paths call the record's save right after each change, read directly from the source. Board-side assignment is therefore instant, with no draft state, while form-side assignment follows the normal save flow.
Why can I not create a new user while assigning from a card?+
The popover opens with every creation route disabled, hardcoded in the source independent of your field options. It is a guard against accidentally creating user accounts, which have license implications, from a quick-assign flow. Create users from Settings instead.
How many avatars show before the +N counter?+
Three on kanban cards and five in list views in Odoo 19, fixed in the variant classes rather than exposed as options. The Odoo 20 development branch turns the cap into a tagLimit prop with defaults of two on cards and five in lists.
Why does clicking an avatar show a card for some fields but not others?+
The avatar card popover is gated by relation: only fields pointing at res.users or res.partner get it, a check read from the chatter mixin. On any other model the click is silently ignored.
What changes for this widget in Odoo 20?+
On the development branch: the kanban registration renames to card.many2many_avatar_user, avatars gain write_date cache busting so picture changes show immediately, the visible-avatar caps become a tagLimit prop, and the avatar card internals are rebuilt. View XML needs no changes. Odoo 20 ships around late September 2026, and we re-verify after release.

Assignment workflows that match how your team really works?

Scoped assignee pickers, closed user lists, boards that reassign in one click without surprises: this widget's options cover it, wired correctly per view. We configure and extend Odoo project and HR screens on 16 through 19.

Book a free consultation

How this page was produced

This page was verified by reading the full descriptor chain in the Odoo 19.0 source: many2many_avatar_user_field.js in mail, its base many2many_tags_avatar_field.js in web including the popover subclass with its immediate save calls, and the inherited options on the many2many_tags descriptor. The 18.0 branch was checked for the version table, and the Odoo 20 section reflects a diff of the same files on the public development branch, clearly marked as unreleased. Spotted an error? Tell us and we will correct the page.