Odoo Core / Web widgets
Core web-client widgets are the ones every Odoo form, list and kanban view is built from: char and text inputs, badges, buttons, avatars, handles and the rendering primitives the other categories specialize.
They ship in every edition, so anything you learn here applies from Community to Enterprise, and most of them can be set from Studio or a one-line XML attribute.
Every core / web widget, by use in Odoo core
| Widget | What it does | Field types | Uses in core |
|---|---|---|---|
| many2many_tags | The Odoo Tags field: what it does, how to set it up in Studio without code, and every option it supports. | many2many, one2many | 391 |
| statinfo | The number inside an Odoo smart button, such as 3 Invoices, is rendered by the statinfo widget. Here is how it works, what it can show, and how to control its label and decimals. | float, integer, monetary, char, one2many, many2one | 197 |
| monetary | The Monetary widget renders an amount with the record's currency symbol and precision. Most of its behavior comes from the currency, not the field, and that is where teams get surprised. | monetary, float, integer | 182 |
| handle | The drag dots on the left of Odoo list rows are the handle widget. It has no options at all; everything that matters happens in the sequence field underneath it. | integer | 155 |
| radio | The radio widget lays every choice of a selection or many2one field out as radio buttons, so users see all options before picking one. | selection, many2one | 151 |
| float_time | The float_time widget displays a float of hours as clock-style time: 8.5 renders as 08:30. Storage stays a plain float, so sums and reports keep working. | float | 146 |
| badge | The badge widget renders a field's value as a colored pill, and its color comes from decoration expressions you write in the view or an integer color field on the record. | selection, many2one, char | 99 |
| image | The image widget displays and uploads pictures on binary fields, with more options than any other display widget, including a WebP pipeline that quietly generates five sizes per upload. | binary, many2one | 92 |
| statusbar | The stage strip at the top of Odoo forms is the statusbar widget. It shows where the record stands, lets users click to move it, and hides two keyboard shortcuts almost nobody uses. | many2one, selection | 67 |
| boolean_toggle | The boolean_toggle widget renders a boolean as a switch, and by default a flip saves the record immediately. That one behavior is most of what you need to know about it. | boolean | 66 |
| color_picker | The color_picker widget edits the integer 0 to 11 behind Odoo's standard palette, the same twelve colors tags, badges and kanban cards read. | integer | 54 |
| upgrade_boolean | The settings checkboxes that open an upgrade popup on Community are one widget: upgrade_boolean. On Enterprise it is an ordinary checkbox; on Community it can never stay checked. | boolean | 45 |
| priority | The stars on tasks and leads are the priority widget over a plain selection field. Clicking a star saves immediately, and clicking the current one clears it, both verified in the source. | selection | 40 |
| percentage | The percentage widget shows a stored fraction as percent: 0.15 displays as 15%, and typing 15 stores 0.15. One convention, consistently applied on both directions. | float, integer | 38 |
| 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. | many2one | 32 |
| kanban_color_picker | The color palette inside a kanban card's dropdown menu is one widget: kanban_color_picker. Zero options, one strong opinion: picking a color saves immediately. | integer | 26 |
| remaining_days | The widget behind every Today, In 3 days and 2 days ago in Odoo. One undocumented option controls the colors, and Odoo 20 renames the whole widget. | date, datetime | 26 |
| color | The color widget turns a plain char field into a native color swatch storing #RRGGBB. Its one option, autosave, is already on in list and kanban views, and Odoo 20 removes it. | char | 25 |
| text | Odoo's Multiline Text widget: the auto-growing textarea behind every notes box. Two documented options, two undocumented ones, and a quiet type change in Odoo 19. | text, char, html | 25 |
| progressbar | Odoo's Progress Bar widget: five options in 19, an undocumented numeric trick, and a development branch that quietly deletes most of them for Odoo 20. | integer, float | 23 |
| phone | Phone numbers in Odoo are plain char fields until the phone widget makes them callable: a tel: link in lists, a Call button on forms, and, courtesy of the sms module, an SMS button you can switch off. | char | 21 |
| url | The url widget turns a char field into a link that opens in a new tab, quietly prefixes http:// when the scheme is missing, and hides one of Odoo's least known tricks: a text attribute that replaces the visible URL with friendly link text. | char | 18 |
| The email widget makes addresses actionable: a mailto: link in lists, an envelope button on forms. What it deliberately does not do, validate addresses beyond the browser's loose check, is just as important to know. | char | 17 | |
| selection_badge | When every option should be visible and one click away, selection_badge replaces the dropdown with a row of pills. It also hides three behaviors nobody expects: a self-clearing click, a text-only readonly mode, and a full reload of many2one options. | selection, many2one | 17 |
| label_selection | Paid in green, Cancelled in red: label_selection paints a selection value as a colored label using one option, classes, a plain mapping from value to color. It displays; it never edits. | selection | 16 |
| CopyClipboardChar | One of the only CamelCase widget names in Odoo core: CopyClipboardChar puts a one-click copy button next to a text value. Small widget, several sharp edges. | char | 15 |
| binary | The default upload and download control for every binary field in Odoo. Its behavior is simple; the filename wiring around it is where implementations go wrong. | binary | 15 |
| domain | The point-and-click filter builder behind automation rules, mailing lists and reordering rules. The domain widget turns a char field into Odoo's condition editor, live record count included. | char, text | 15 |
| selection | The default dropdown behind every Selection field in Odoo, and the widget that turns a many2one into a closed list. How it works, what it hides, and where it trips teams up. | many2one, selection | 15 |
| boolean_favorite | The clickable star on products, journals and applicants. The boolean_favorite widget looks like a toggle and behaves like a save button, which is exactly what teams need to know before adopting it. | boolean | 14 |
| many2many_binary | Several files on one record, uploaded in one go: the many2many_binary widget turns a many2many to ir.attachment into Odoo's multi file upload zone. | many2many | 13 |
| one2many | Order lines, BoM components, task checklists: the one2many widget is the embedded table Odoo runs on, and its options can do more than the documentation admits. | one2many, many2many | 12 |
| many2many_tags_avatar | The avatar tags field renders people-type relations as pills with faces: each tag carries the record's avatar, and kanban cards get a quick-assign popover. | many2many, one2many | 10 |
| field_selector | The field selector puts Odoo's field-path picker on a char field: users browse a model's fields, drill through relations like partner_id.country_id.code, and the dotted path is what gets stored. | char | 9 |
| html | The HTML field is Odoo's rich text editor: checklists, tables, images, slash commands. Under the hood it is two widgets wearing one name, and its options live nowhere in the documentation. | html | 9 |
| properties | The Properties field lets end users bolt their own fields onto records, per project, per team, per parent, without Studio, without a developer, and without touching the database schema. | properties | 9 |
| many2many_checkboxes | The Checkboxes field lists every record of a relation as a tickbox: no search, no create, the whole choice space visible at once. Ideal for short fixed sets like product routes. | many2many | 8 |
| float | Every decimal number in Odoo passes through the float widget. Its option panel hides a naming trap, and since 19.0 the input quietly evaluates math. Here is the full, source-verified picture. | float, monetary | 7 |
| CopyClipboardURL | Share links, webhook endpoints, portal URLs: CopyClipboardURL renders a char field as a clickable link with a one-click copy button, and its name is one of the few in Odoo where capitalization matters. | char | 6 |
| many2one | The autocomplete dropdown on Customer, Product and every other record link in Odoo is the many2one widget. It is the default for its field type, which is why you rarely type its name, and why its options are worth knowing by heart. | many2one | 6 |
| filterable_selection | One selection field, different choices per view: filterable_selection filters a selection's dropdown with a whitelist, a blacklist, or a list read live from another field on the record, without touching the model. | selection, many2one | 5 |
| percentpie | The little circles on a mailing's statistics, Opened 54%, Clicked 12%, are percentpie: a display-only widget that draws a number as a filled circle using nothing but a CSS conic-gradient. | float, integer | 5 |
| state_selection | The small gray, red or green bullet on kanban cards and list rows is the state_selection widget. It turns a three value selection field into a one click status dropdown, and its label behavior is stranger than the docs admit. | selection | 5 |
| boolean | The default Checkbox for every boolean field in Odoo: what the bare boolean widget does, why it never hides, and when to trade it for a toggle, star, or favorite variant. | boolean | 4 |
| image_url | image_url renders a plain char field as an image, fetched by the browser straight from the URL it contains. Nothing is downloaded or stored server side, which is exactly its power and its caveat. | char | 4 |
| many2many | The default face of a many2many field is an embedded table of linked records with an Add line that opens a selection dialog. Less known: writing widget="many2many" on a one2many field flips it into link and unlink mode, a trick Odoo core itself uses. | many2many, one2many | 4 |
| many2one_barcode | many2one_barcode is the smallest widget on this site with a real job: it is the standard many2one with the mobile barcode scanner permanently switched on, so warehouse and accounting users fill product fields by pointing a camera at a label. | many2one | 4 |
| section_one2many | Working schedules in Odoo show Morning and Afternoon as bold rows spanning the whole table. That layout is section_one2many, a resource module one2many whose section rows are ordinary records with display_type = 'line_section' and a hardcoded title field. | one2many | 4 |
| CopyClipboardButton | Of Odoo's three clipboard widgets, CopyClipboardButton is the only one that hides the value: just a button that puts the field's content on the clipboard, and nothing at all when the field is empty. | char, text | 3 |
| attachment_image | The picture on a project task's kanban card is not a binary field. It is attachment_image: a tiny display-only widget that turns a many2one to ir.attachment into a 300x300 image. | many2one | 3 |
| code | One widget, two names: code and ace are the same registered descriptor that swaps a plain textarea for a real Ace editor with syntax highlighting, dark mode, and careful save semantics. | text, html | 3 |
| contact_image | New in Odoo 19: the photo frame on contact and user forms is its own widget. contact_image extends the image field with one trick, when the photo is empty it shows the record's generated avatar and a centered Add Photo button. | binary, many2one | 3 |
| account_json_checkboxes | The checkbox rows on Odoo's invoice Send wizard are not boolean fields: account_json_checkboxes renders a whole JSON dict as a group of checkboxes, each with its own label, lock and help icon. | json | 2 |
| gauge | The gauge widget turns an integer or float into a half-doughnut Chart.js gauge, mostly on kanban dashboards. Its most important fact is a naming bug: the declared max_value_field option is dead, and max_field is the one that works. | integer, float | 2 |
| integer | The Integer field widget is the default editor for whole numbers in Odoo. Behind the plain input sit formatting toggles, two undocumented options, relative typed math, and a placeholder that quietly stopped working in 19. | integer | 2 |
| tour_start_widget | The Onboarding and Testing buttons on Odoo's Tours screen are one widget: tour_start_widget, a char field that never shows its value and instead launches the tour in manual or automated mode. | char, text | 2 |
| base_automation_actions_one2many | A rule's actions shown as one horizontal strip that measures itself against the available width and hides what does not fit behind an and 3 more counter. | one2many | 1 |
| base_automation_trigger_selection | The trigger dropdown on an automation rule, grouped into six headings and filtered against the model you picked. Choose a model with no stage field and the stage triggers are simply not offered. | selection | 1 |
| binary_spreadsheet | The binary field widget with the download deliberately removed, twice over: once in the template and once in the handler. The value it holds is not a file anyone can usefully open. | binary | 1 |
| boolean_icon | A boolean drawn as a single icon rather than a checkbox or a switch. One option changes the glyph, and the label comes from the field's own string. | boolean | 1 |
| char | The default renderer for every text field in Odoo, and the base a dozen other widgets extend. It declares one option and quietly accepts three more. | char, text | 1 |
| dashboard_graph | The little line and bar charts on Odoo's accounting dashboard are a text field and a Chart.js canvas. One attribute decides which chart you get, and there is no third option. | text | 1 |
| google_slide_viewer | Paste a Google Docs link into a text field and get the deck embedded on the form. The URL is rewritten by a regular expression, and the starting page comes from a companion field named by convention. | char, text | 1 |
| iframe_wrapper | For HTML that is a whole document rather than a fragment: styles, head metadata, the lot. It writes the value straight into an iframe, and the source explains at length why. | text, html | 1 |
| pdf_viewer | A stored PDF rendered inline instead of offered as a download. It hides the viewer's own download and print buttons, and it declares an option the code never actually reads. | binary | 1 |
| reference | One field, two questions: which model, then which record. reference is the widget behind that pair of inputs, and it accepts far more options than it admits to. | reference, char | 1 |
| timezone_mismatch | A timezone dropdown that checks itself against your browser and, when they disagree, prints the actual current time in the selected zone next to its name. | selection | 1 |
Each widget page has the usage XML, Studio steps, every developer option, and a per-version compatibility table verified against the shipped Odoo source.
Other widget categories
Need these working in your Odoo?
The team that documented every widget also builds with them — custom views, upgrades and performance work by senior Odoo developers.
