Skip to main content
iVentureTeam

property_tags

The property_tags widget renders the tag values of a properties field. Two of its most important behaviors are hardcoded in the field wrapper and cannot be changed from a view.

September 18, 2026Updated September 18, 20265 min read
Technical nameproperty_tags
Field typesproperties (tags)
Viewsform, list
Moduleweb, present in every Odoo database
Used in core0 explicit uses in Odoo 19 Community or Enterprise. The PropertyTags component behind it is used directly by property_value.xml inside the properties field.
VersionsOdoo 19.0, Odoo 20.0
No-code setupPartly. Properties themselves are configured by end users on the parent record, but this widget has no Studio entry and no settings of its own.
Alternativesmany2many_tags, properties, selection

What the property_tags widget does

Odoo properties let end users add their own fields to a record without a developer. One of the property types is tags, where the user defines a set of labeled, colored values and then picks from them.

The property_tags widget renders the picking half of that: the selected values as pills, plus an autocomplete to add another. The tag definitions themselves are read out of the field definition, record.fields[name].tags, rather than from a separate model. There is no tag table and no related records.

The descriptor is a single line. It names a component and nothing else: no displayName, no supportedTypes, no supportedOptions.

What this means for your team

Properties are the escape valve for teams who need one more field on a project or a knowledge article and do not want a development cycle for it. Tag properties are the version of that for a small, controlled vocabulary.

The thing to set expectations about is who can change the vocabulary. Through this widget, nobody can. Users select from tags that already exist and remove their own selections, and that is the whole range of what they can do. Defining, renaming and recoloring tags happens in the property definition on the parent record, which is a different screen and often a different permission.

Working examples

The widget is applied to a tag-type property value:

<field name="my_tags_property" widget="property_tags"/>

In practice you rarely write this, because the properties field renders tag properties through the same component automatically. Standard Odoo 19 never writes it at all.

Two behaviors hardcoded in the field wrapper

The underlying PropertyTags component is capable of more than the field widget exposes. It can create tags, delete them from the definition, and open a color popover to recolor them. The field wrapper switches all of that off:

get propertyTagsProps() {
    return {
        selectedTags: this.props.record.data[this.props.name] || [],
        tags: this.props.record.fields[this.props.name].tags || [],
        deleteAction: "value",
        readonly: this.props.readonly,
        canChangeTags: false,
        onValueChange: (value) => { ... },
    };
}

canChangeTags: false is why clicking a pill does nothing instead of opening the color picker, and why typing a new name offers No result rather than Create. deleteAction: "value" is why the cross on a pill unselects the tag rather than deleting it from the vocabulary. Neither is configurable. There is no option to flip them, because the wrapper never looks at options.

The second hardcoded behavior is easier to miss and more likely to be reported as a bug. In the component:

get displayBadge() {
    return !this.env.config || this.env.config.viewType !== "kanban";
}

and then, when building the list:

if (!this.displayBadge) {
    // in kanban view e.g. to not show tag without color
    value = value.filter((tag) => tag[2]);
}

In a kanban view, a tag whose color index is 0 or unset is removed from the rendered list entirely. A user who tagged a card and cannot see the tag on the board has not hit a caching problem. The tag has no color. Give it one in the property definition and it reappears.

Version compatibility

VersionStatusNotes
Odoo 19.0VerifiedVerified against the shipped 19.0 source.
Odoo 20.0VerifiedVerified against the 20.0 branch. No changes.

Unchanged between the two branches we checked.

What is changing in Odoo 20

No change. Diffing the property_tags registration between the 19.0 and 20.0 branches shows no options added or removed and no registration changes.

Worth noting alongside it: Odoo 20 adds a separate property_selection widget and a named properties_definition registration, neither of which existed under those names in Odoo 19. The properties area is being built out, but this particular widget was left alone.

Common problems and fixes

SymptomCause and fix
A tag is visible on the form but missing on the kanban cardThe tag has no color. In kanban views the widget filters out every tag whose color index is 0 or unset. Set a color on the tag in the property definition.
Clicking a tag does not open the color pickerThe field wrapper passes canChangeTags: false, so the click handler blurs and returns. Change the color in the property definition on the parent record. It cannot be done from this widget.
Typing a new tag name offers 'No result' instead of 'Create'Same cause. Tag creation is disabled in the field wrapper. Add the value to the property definition first, then select it here.
The cross on a pill does not remove the tag from the list of choicesdeleteAction is hardcoded to 'value', so the cross unselects rather than deletes. Working as designed. Edit the property definition to remove a choice.

Property_tags widget vs the alternatives

WidgetBest forKey difference
property_tagsSelecting from a user-defined tag vocabulary on a properties fieldSelection only: the vocabulary is read-only here and colorless tags vanish in kanban
many2many_tagsA shared tag vocabulary across many recordsBacked by a real model, so tags are searchable, reportable and centrally managed
propertiesThe full set of user-defined properties on a recordRenders every property type, and is where tag properties normally appear
selectionOne value from a fixed developer-defined listSingle value, defined in code rather than by users

The real decision is not between widgets, it is between properties and real fields. Properties are excellent when each project or article needs its own handful of attributes and nobody wants a migration for it. They are poor when you need to report across records, because a property lives inside a json column rather than in a column of its own. If your team is building the same tag property on record after record, that vocabulary has earned a real many2many and a tag model.

Frequently asked questions

Why can I not create a new tag on an Odoo property field?+
Because the field wrapper passes canChangeTags: false to the tags component, which disables creation, renaming and recoloring. There is no option to change it. Add the value to the property definition on the parent record instead.
Why is my property tag invisible on the kanban card?+
Because it has no color. In kanban views the widget filters out every tag whose color index is 0 or unset, so it is removed rather than shown in grey. Assign a color in the property definition and it appears.
Does property_tags have any options?+
No. Its descriptor names a component and nothing else: no display name, no supported types and no supported options. The field wrapper never reads the view's options dictionary.
Should I use properties or a real many2many for tags?+
Use properties when each record needs its own small vocabulary and nobody will report across records. Use a real many2many with a tag model when the same tags recur and you need to filter, group or report on them, because a property value lives inside a json column.

Properties that outgrew themselves?

Property tags are perfect until someone asks to report across them, and then the json column becomes the problem. We know where that line is, and we move the vocabulary into real fields before it turns into a data-cleanup project.

Talk to an Odoo consultant

How this page was produced

Verified by reading addons/web/static/src/views/fields/properties/property_tags.js on the 19.0 branch of a local clone of the official Odoo repository. The hardcoded canChangeTags and deleteAction values are quoted from the field wrapper's propertyTagsProps getter, and the kanban color filter from the component's displayBadge getter and tagListItems. The registration was diffed against the 20.0 branch. Usage counts come from scanning every XML file in Community, Enterprise and odoo/addons/base. Corrections welcome via our contact page.