Skip to main content
iVentureTeam

many2many_tags_journals

The many2many_tags_journals widget is the Tags field with one accounting-specific trick: when a Multi-ledger group belongs to no company, every journal pill spells out which company it comes from.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 25, 2026Updated August 25, 20266 min read
Technical namemany2many_tags_journals
Field typesmany2many
Viewsform, list
Moduleaccount, installed with Invoicing or Accounting
Used in core2 occurrences in 1 module: the account.journal.group list and form (Multi-ledger setup)
VersionsOdoo 19.0
No-code setupNo. This widget is applied in view XML; Studio has no toggle for it
Alternativesmany2many_tags, many2many_tags_avatar, many2many_checkboxes

What the journal tags widget does

Odoo 19's Multi-ledger feature lets accountants define journal groups such as GAAP or IFRS by excluding journals from a group. In a multi-company database those groups can be shared: the company_id on account.journal.group is optional, and an empty company means the group is visible to every company. That creates a display problem the standard Tags field cannot solve. Two companies routinely have journals with identical names, so a pill reading just Miscellaneous Operations is ambiguous.

The many2many_tags_journals widget is the fix. It subclasses the standard many2many_tags component and overrides exactly one rendering decision: if the parent group has no company set, every pill is rendered as Company - Journal, and the autocomplete dropdown appends the company name in muted italics after each suggestion. The moment the group is assigned to a company, both prefixes vanish and the widget is indistinguishable from the plain Tags field.

To make the dropdown annotation possible, the widget ships its own autocomplete subclass that adds company_id.display_name to the search specification, and its field descriptor extends relatedFields so every selected journal is fetched with its company. That is the entire delta: no new options, no new behavior beyond labeling.

What this means for your team

If you run consolidated reporting across companies, Multi-ledger groups are how you keep local books and group books apart, and this widget is what keeps the setup screen honest. The failure mode it prevents is real: an accountant excludes what looks like the right journal from the IFRS ledger, but it belongs to the wrong company, and the consolidated report is quietly wrong until someone reconciles it weeks later.

For teams customizing Odoo, the widget is also a compact lesson in how to extend the Tags field correctly. It changes pill text by overriding getTagProps, enriches the dropdown through a custom Many2XAutocomplete, and declares the extra field it needs through relatedFields instead of hoping the view loads it. If you need journals, or any records, labeled by company elsewhere, copying this three-part pattern is the maintainable route, and it is the pattern we reuse in custom Odoo development work.

Supported options in Odoo 19

The widget declares no options of its own. Because its descriptor spreads many2ManyTagsField, every option of the standard Tags field is inherited and works here. The rows below are the ones that matter in practice on journal groups, verified against many2many_tags_journals.js and the inherited descriptor in Odoo 19.0.

OptionTypeWhat it does
no_createbooleanInherited from many2many_tags. Removes every creation path from the dropdown. Core sets it on both Multi-ledger views so accountants cannot create journals from the group screen.
color_fieldfield nameInherited from many2many_tags. Name of an integer field on account.journal holding a color index. Core does not use it here, but it works if your customization adds one.
no_quick_createbooleanInherited from many2many_tags. Removes only the inline Create entry that turns typed text into a record.
no_create_editbooleanInherited from many2many_tags. Removes only the Create and Edit entry that opens a popup form.
search_thresholdnumberInherited from many2many_tags. Minimum characters typed before the journal search fires.
placeholder_fieldfield nameInherited from many2many_tags. A char field on the parent record supplying a dynamic placeholder.

The company prefix is not an option. There is no key to force or suppress the Company - Journal text. The widget reads the parent record's company_id value at render time: empty means prefixed pills, set means plain pills. If you need different behavior you must subclass, not configure.

Working examples

How core uses it (Multi-ledger list, Odoo 19)

<list editable="bottom">
    <field name="company_id" column_invisible="True"/>
    <field name="name" placeholder="e.g. GAAP, IFRS, ..."/>
    <field name="excluded_journal_ids"
        widget="many2many_tags_journals"
        options="{'no_create': True}"/>
</list>

Note the invisible company_id on the first line. It is not decoration: the widget's template reads record.data['company_id'].id directly, so the field must be present in the view for the widget to render at all.

Reusing it on a custom journal many2many

<field name="journal_ids"
       widget="many2many_tags_journals"
       options="{'no_create': True, 'color_field': 'color'}"/>
<!-- the model must have a company_id many2one, loaded in the same view -->

Because the full Tags descriptor is inherited, color_field and the creation-blocking options work unchanged. The relation should be account.journal; the company prefix logic assumes journal records carrying a company_id.

How the company prefix actually works

Three implementation details are worth knowing before you rely on or extend this widget.

The prefix decision reads a hardcoded field name. getTagProps checks this.props.record.data["company_id"] on the parent record. On a model without that exact field name the template expression crashes rather than degrading, which is why both core views load company_id even when the multi-company group feature is hidden.

The dropdown annotation and the pill prefix are implemented separately. The pill text comes from getTagProps; the dropdown company suffix comes from a template extension of Many2XAutocomplete that only renders when the group_company_id prop is falsy. Both react to the same condition, so they stay in sync, but a subclass overriding one must remember the other.

Selected journals are fetched with their company through relatedFields. The descriptor appends {name: "company_id", type: "many2one", relation: "res.company"} to the inherited list, and the custom autocomplete adds company_id.display_name to the search specification. That is why the company names appear without any extra query and without the view having to load anything on the journal side.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The development branch deletes the widget; journal group views switch to many2many_tags with a show_company_journal context key. Re-verified after launch.
Odoo 19.0VerifiedIntroduced in Odoo 19 together with the Multi-ledger journal group screens. Behavior verified against the shipped source.
Odoo 18.0Not availableThe widget does not exist. Journal groups render with the standard many2many_tags widget.
Odoo 17.0Not availableThe widget does not exist.
Odoo 16.0Not availableThe widget does not exist.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The notes below are read from the public development branch, which is unstable until feature freeze; we re-verify this page against the shipped release.

The widget is deleted on the development branch. The entire many2many_tags_journals component directory is gone, and no alias is registered. Custom views that reference the widget name will fall back to the default many2many rendering with a console warning after an upgrade.

Its job moves server-side. The journal group views on the development branch use the plain many2many_tags widget with context="{'show_company_journal': True}", letting the journal's display_name computation produce the company-qualified label instead of the client. The same branch also reshapes the model, with the views built around an included_journal_ids field rather than excluded_journal_ids.

What to do about it: if you copied this widget's name into custom XML, plan to swap it for many2many_tags plus the context key during your Odoo 20 migration, and re-test any code that assumed exclusion semantics on journal groups.

Common problems and fixes

SymptomCause and fix
The view crashes or the field renders blank on a custom modelThe template reads record.data['company_id'].id directly, and the model or view does not provide a company_id field. Add a company_id many2one to the model and load it in the view, invisibly if needed, exactly as core does.
Pills show plain journal names with no company prefixThe parent record has a company set. Prefixes only render when company_id is empty. This is the designed behavior. Clear the group's company to see cross-company labels.
Company names appear in the dropdown but not on the pills, or vice versaA customization overrode getTagProps or the autocomplete template, which implement the two halves separately. Mirror the same company_id condition in both overrides.
Widget name warning in the console after upgrading past 19The component is removed on the Odoo 20 development branch, so the registry falls back by field type. Replace the widget with many2many_tags plus context show_company_journal during migration.
Users can create journals from the group screenA custom view dropped the no_create option that core passes. Restore options="{'no_create': True}" on the field.

Journal tags widget vs the alternatives

WidgetBest forKey difference
many2many_tags_journalsJournal many2many fields on records whose company can be emptyPrefixes each pill and dropdown entry with the journal's company when the parent has no company
many2many_tagsEvery ordinary tag list, including journals on single-company modelsNo company awareness; identical names from different companies are indistinguishable
many2many_tags_avatarPeople rather than journalsShows record avatars inside the pills instead of text prefixes
many2many_checkboxesShort fixed journal lists users must see in fullRenders every journal as a checkbox, with no search and no pills

Reach for this widget only when the parent record has an optional company and the tags are journals. In every other multi-company labeling case, a context key or a display_name override is the lighter tool.

Frequently asked questions

Where does Odoo actually use many2many_tags_journals?+
In exactly two places, both in the account module: the list and form views of account.journal.group, the Multi-ledger configuration introduced with Odoo 19's accounting. The field is excluded_journal_ids, always with no_create.
Why do my journal pills show a company name in front?+
Because the journal group has no company assigned. A group with an empty company is shared across companies, so the widget prefixes every pill with the journal's company to keep same-named journals apart. Assign the group to one company and the prefixes disappear.
Can I use many2many_tags_journals on my own model?+
Yes, provided the field relates to account.journal and the model exposes a company_id many2one that the view loads. Without that exact field name the template expression fails, which is why core loads it invisibly in both of its views.
Does it support the same options as many2many_tags?+
Yes. The descriptor spreads the full many2ManyTagsField definition, so color_field, the three creation-blocking options, search_threshold and placeholder_field all work. The company prefix itself has no option; it is driven by the record's company.
What happens to this widget in Odoo 20?+
The development branch removes the component entirely and instead passes context="{'show_company_journal': True}" to a plain Tags field, moving the company-qualified label into the server-side display name. Nothing is final until the September 2026 release, and we re-verify this page after launch.
Is many2many_tags_journals available in Odoo 16, 17 or 18?+
No. It first appears in Odoo 19. On earlier versions the journal group screens use the standard Tags widget, and custom XML referencing the name would fall back to the default many2many rendering with a console warning.

Multi-company accounting quirks eating your week?

Shared ledgers, company-scoped journals and consolidation views are where multi-company Odoo setups go wrong quietly. We configure and extend Odoo accounting for groups running 16 through 19, and we already track the Odoo 20 branch where this widget disappears.

Talk to an Odoo accounting expert

How this page was produced

Every statement on this page was read from the Odoo 19.0 source: many2many_tags_journals.js and its QWeb template in the account module, the inherited many2many_tags_field.js descriptor in web, and the two account.journal.group views in account_journal_views.xml. The Odoo 20 section comes from diffing the same paths against the public development branch, where the component directory is removed. Usage counts come from our index of every widget reference in the 19.0 addons tree. Spotted something we missed? Tell us and we will correct the page.