Skip to main content
iVentureTeam

Odoo Widgets Reference

212 widgets documented. What each widget does, how to enable it in Studio with no code, and every developer option — verified against the Odoo source.

Core / Web59

CopyClipboardButtonchar, text

Of Odoo's three clipboard widgets, <code>CopyClipboardButton</code> 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.

Read the guide
CopyClipboardCharchar

One of the only CamelCase widget names in Odoo core: <strong>CopyClipboardChar</strong> puts a one-click copy button next to a text value. Small widget, several sharp edges.

Read the guide
CopyClipboardURLchar

Share links, webhook endpoints, portal URLs: <code>CopyClipboardURL</code> 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.

Read the guide
account_json_checkboxesjson

The checkbox rows on Odoo's invoice Send wizard are not boolean fields: <strong>account_json_checkboxes</strong> renders a whole JSON dict as a group of checkboxes, each with its own label, lock and help icon.

Read the guide
attachment_imagemany2one

The picture on a project task's kanban card is not a binary field. It is <code>attachment_image</code>: a tiny display-only widget that turns a <strong>many2one to ir.attachment</strong> into a 300x300 image.

Read the guide
badgeselection, many2one, char

The <code>badge</code> widget renders a field's value as a colored pill, and its color comes from <strong>decoration expressions</strong> you write in the view or an integer <strong>color field</strong> on the record.

Read the guide
binarybinary

The default upload and download control for every <strong>binary</strong> field in Odoo. Its behavior is simple; the <code>filename</code> wiring around it is where implementations go wrong.

Read the guide
booleanboolean

The default <strong>Checkbox</strong> for every boolean field in Odoo: what the bare <code>boolean</code> widget does, why it never hides, and when to trade it for a toggle, star, or favorite variant.

Read the guide
boolean_favoriteboolean

The clickable star on products, journals and applicants. The <strong>boolean_favorite</strong> widget looks like a toggle and behaves like a save button, which is exactly what teams need to know before adopting it.

Read the guide
boolean_iconboolean

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.

Read the guide
boolean_toggleboolean

The <code>boolean_toggle</code> widget renders a boolean as a switch, and by default a flip <strong>saves the record immediately</strong>. That one behavior is most of what you need to know about it.

Read the guide
charchar, text

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.

Read the guide
codetext, html

One widget, two names: <code>code</code> and <code>ace</code> are the same registered descriptor that swaps a plain textarea for a real Ace editor with syntax highlighting, dark mode, and careful save semantics.

Read the guide
colorchar

The <code>color</code> widget turns a plain char field into a native color swatch storing <strong>#RRGGBB</strong>. Its one option, <code>autosave</code>, is already on in list and kanban views, and Odoo 20 removes it.

Read the guide
color_pickerinteger

The <code>color_picker</code> widget edits the integer 0 to 11 behind Odoo's standard palette, the same twelve colors tags, badges and kanban cards read.

Read the guide
contact_imagebinary, many2one

New in Odoo 19: the photo frame on contact and user forms is its own widget. <code>contact_image</code> extends the image field with one trick, when the photo is empty it shows the record's <strong>generated avatar</strong> and a centered <strong>Add Photo</strong> button.

Read the guide
domainchar, text

The point-and-click filter builder behind automation rules, mailing lists and reordering rules. The <strong>domain</strong> widget turns a char field into Odoo's condition editor, live record count included.

Read the guide
emailchar

The <code>email</code> widget makes addresses actionable: a <code>mailto:</code> 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.

Read the guide
field_selectorchar

The <strong>field selector</strong> puts Odoo's field-path picker on a char field: users browse a model's fields, drill through relations like <code>partner_id.country_id.code</code>, and the dotted path is what gets stored.

Read the guide
filterable_selectionselection, many2one (inherited from the selection field)

One selection field, different choices per view: <code>filterable_selection</code> 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.

Read the guide
floatfloat, monetary

Every decimal number in Odoo passes through the <code>float</code> widget. Its option panel hides a naming trap, and since 19.0 the input quietly evaluates math. Here is the full, source-verified picture.

Read the guide
float_timefloat

The <code>float_time</code> widget displays a <strong>float of hours</strong> as clock-style time: 8.5 renders as 08:30. Storage stays a plain float, so sums and reports keep working.

Read the guide
google_slide_viewerchar, text

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.

Read the guide
handleinteger

The drag dots on the left of Odoo list rows are the <code>handle</code> widget. It has no options at all; everything that matters happens in the <strong>sequence field</strong> underneath it.

Read the guide
htmlhtml

The <strong>HTML field</strong> 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.

Read the guide
iframe_wrappertext, html

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.

Read the guide
imagebinary, many2one

The <code>image</code> 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.

Read the guide
image_urlchar

<code>image_url</code> 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.

Read the guide
kanban_color_pickerinteger (color index)

The color palette inside a kanban card's dropdown menu is one widget: <code>kanban_color_picker</code>. Zero options, one strong opinion: picking a color <strong>saves immediately</strong>.

Read the guide
label_selectionselection

Paid in green, Cancelled in red: <code>label_selection</code> paints a selection value as a colored label using one option, <code>classes</code>, a plain mapping from value to color. It displays; it never edits.

Read the guide
many2manymany2many, one2many

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 <code>widget="many2many"</code> on a <strong>one2many</strong> field flips it into link and unlink mode, a trick Odoo core itself uses.

Read the guide
many2many_binarymany2many

Several files on one record, uploaded in one go: the <strong>many2many_binary</strong> widget turns a many2many to <code>ir.attachment</code> into Odoo's multi file upload zone.

Read the guide
many2many_checkboxesmany2many

The <strong>Checkboxes field</strong> 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.

Read the guide
many2many_tagsmany2many, one2many

The Odoo <strong>Tags</strong> field: what it does, how to set it up in Studio without code, and every option it supports.

Read the guide
many2many_tags_avatarmany2many, one2many

The <strong>avatar tags field</strong> renders people-type relations as pills with faces: each tag carries the record's avatar, and kanban cards get a quick-assign popover.

Read the guide
many2onemany2one

The autocomplete dropdown on Customer, Product and every other record link in Odoo is the <code>many2one</code> 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.

Read the guide
many2one_avatarmany2one

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

Read the guide
many2one_barcodemany2one

<code>many2one_barcode</code> 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.

Read the guide
monetarymonetary, float, integer

The <strong>Monetary</strong> 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.

Read the guide
one2manyone2many, many2many

Order lines, BoM components, task checklists: the <strong>one2many</strong> widget is the embedded table Odoo runs on, and its options can do more than the documentation admits.

Read the guide
pdf_viewerbinary

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.

Read the guide
percentagefloat, integer

The <code>percentage</code> widget shows a stored <strong>fraction</strong> as percent: 0.15 displays as 15%, and typing 15 stores 0.15. One convention, consistently applied on both directions.

Read the guide
percentpiefloat, integer

The little circles on a mailing's statistics, Opened 54%, Clicked 12%, are <code>percentpie</code>: a display-only widget that draws a number as a filled circle using nothing but a CSS conic-gradient.

Read the guide
phonechar

Phone numbers in Odoo are plain char fields until the <code>phone</code> widget makes them callable: a <code>tel:</code> link in lists, a Call button on forms, and, courtesy of the <code>sms</code> module, an SMS button you can switch off.

Read the guide
priorityselection

The stars on tasks and leads are the <code>priority</code> widget over a plain <strong>selection field</strong>. Clicking a star saves immediately, and clicking the current one clears it, both verified in the source.

Read the guide
progressbarinteger, float

Odoo's <strong>Progress Bar</strong> widget: five options in 19, an undocumented numeric trick, and a development branch that quietly deletes most of them for Odoo 20.

Read the guide
propertiesproperties

The <strong>Properties field</strong> 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.

Read the guide
radioselection, many2one

The <code>radio</code> widget lays every choice of a <strong>selection or many2one</strong> field out as radio buttons, so users see all options before picking one.

Read the guide
remaining_daysdate, datetime

The widget behind every <strong>Today</strong>, <strong>In 3 days</strong> and <strong>2 days ago</strong> in Odoo. One undocumented option controls the colors, and Odoo 20 renames the whole widget.

Read the guide
section_one2manyone2many

Working schedules in Odoo show Morning and Afternoon as bold rows spanning the whole table. That layout is <code>section_one2many</code>, a resource module one2many whose section rows are ordinary records with <code>display_type = 'line_section'</code> and a hardcoded <code>title</code> field.

Read the guide
selectionmany2one, selection

The default dropdown behind every <strong>Selection</strong> 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.

Read the guide
selection_badgeselection, many2one

When every option should be visible and one click away, <code>selection_badge</code> 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.

Read the guide
state_selectionselection

The small gray, red or green bullet on kanban cards and list rows is the <code>state_selection</code> widget. It turns a three value selection field into a one click status dropdown, and its label behavior is stranger than the docs admit.

Read the guide
statinfofloat, integer, monetary, char, one2many, many2one

The number inside an Odoo smart button, such as <strong>3 Invoices</strong>, is rendered by the <code>statinfo</code> widget. Here is how it works, what it can show, and how to control its label and decimals.

Read the guide
statusbarmany2one, selection

The stage strip at the top of Odoo forms is the <code>statusbar</code> widget. It shows where the record stands, lets users click to move it, and hides two keyboard shortcuts almost nobody uses.

Read the guide
texttext, char, html

Odoo's <strong>Multiline Text</strong> widget: the auto-growing textarea behind every notes box. Two documented options, two undocumented ones, and a quiet type change in Odoo 19.

Read the guide
tour_start_widgetchar, text

The <strong>Onboarding</strong> and <strong>Testing</strong> buttons on Odoo's Tours screen are one widget: <code>tour_start_widget</code>, a char field that never shows its value and instead launches the tour in manual or automated mode.

Read the guide
upgrade_booleanboolean

The settings checkboxes that open an upgrade popup on Community are one widget: <code>upgrade_boolean</code>. On Enterprise it is an ordinary checkbox; on Community it can <strong>never stay checked</strong>.

Read the guide
urlchar

The <code>url</code> widget turns a char field into a link that opens in a new tab, quietly prefixes <code>http://</code> when the scheme is missing, and hides one of Odoo's least known tricks: a <code>text</code> attribute that replaces the visible URL with friendly link text.

Read the guide

Website / Marketing12

CopyClipboardJobLinkButtonchar

A copy button for a job posting's link, with a notification confirming the copy rather than a silent state change.

Read the guide
EventMailTemplateReferenceFieldreference, char

The template picker on Odoo's event communication lines is a tuned <code>reference</code> widget: <code>EventMailTemplateReferenceField</code> preselects the first template model, marks mail templates with an envelope, and refuses to open records from readonly rows.

Read the guide
boolean_phoneboolean

New in Odoo 19, <strong>boolean_phone</strong> is the smallest kind of widget: a boolean that renders a phone icon when true and nothing at all when false, built to show which livechat agents are currently in a call.

Read the guide
char_emojischar, text

The <strong>char_emojis</strong> widget is a standard single-line text input with one addition: an emoji button that opens Odoo's full emoji picker and inserts the chosen emoji at the cursor.

Read the guide
chatbot_steps_one2manyone2many

The steps list in Odoo's chatbot builder. Saving the whole script after every step sounds heavy-handed until you try building a script without it.

Read the guide
im_livechat.rating_percentageinteger, float (as a pivot/graph measure)

Unusual entry in the widget inventory: <code>im_livechat.rating_percentage</code> is not a field widget at all. It is a <strong>formatter</strong> that turns Livechat's 1 to 5 rating scale into a 0 to 100 percentage inside pivot and graph reports.

Read the guide
page_urlchar

The address bar for a website page. It hides the leading slash while you type, puts it back when saving, and nudges the server to show you what a rename would break before you commit.

Read the guide
text_emojistext, char

The multi-line text field with an emoji button attached. Small feature, and the only reason it exists is that social and marketing copy without emoji reads like a memo.

Read the guide
website_publish_buttonboolean

The <strong>Published</strong> smart button that turns into red <strong>Unpublish</strong> when you hover it is two parts: a server method and this widget. <code>website_publish_button</code> renders the label; it toggles nothing itself.

Read the guide
website_redirect_buttonboolean

The <strong>website redirect button</strong> turns the <code>is_published</code> flag into a header button that reads Published or Unpublished and jumps straight to the record's public page.

Read the guide
website_urlschar

One core view asks for <code>widget="website_urls"</code>. Nothing in Odoo registers that name, in any version we checked. The field still renders, and this page explains exactly why.

Read the guide
x2_many_media_viewerone2many, many2many

The <strong>Add Media</strong> gallery on eCommerce products is a one2many wearing a media manager. <code>x2_many_media_viewer</code> swaps the usual Add row for Odoo's image and video dialog, and can transcode every upload to WebP.

Read the guide

Accounting / Localization29

PaymentWizardCopyClipboardButtonFieldchar, text

The Copy button on a payment link, with one addition: it waits for the record to finish updating before it copies. Without that, a fast click copies the previous link.

Read the guide
account-tax-totals-fieldJSON value (no supportedTypes declared; core stores it in a computed binary field)

The untaxed, tax and total block at the bottom right of every Odoo invoice is one widget: <code>account-tax-totals-field</code>. It renders a JSON payload, and it quietly lets you type over a computed tax amount.

Read the guide
account_batch_sending_summaryjson

Before Odoo sends fifty invoices, it tells you how each one will go out. This widget is the read-only panel that shows that answer, and it reads the value exactly once.

Read the guide
account_document_stateselection, many2one

Government e-invoicing replies rarely fit in a status column. <code>account_document_state</code> renders the selection state and, whenever the record carries a <code>message</code>, adds an info icon whose popover shows the full text with a copy button.

Read the guide
account_type_selectionselection (many2one also accepted through the base selection widget)

The Type dropdown on an Odoo account is not a flat list. The <code>account_type_selection</code> widget buckets every account type under <strong>Balance Sheet</strong> and <strong>Profit &amp; Loss</strong> headings so accountants pick from a structured tree instead of a 15 item flat list.

Read the guide
actionable_errorsjson

The <strong>actionable errors widget</strong> turns a computed JSON field into a stack of ranked alert boxes, each with a button that jumps the user straight to the fix.

Read the guide
analytic_distributionjson

The field that splits a journal item across analytic accounts by percentage is one widget: <code>analytic_distribution</code>. Eight options, a tag-based editor, and a type change in 19 worth knowing about.

Read the guide
auto_save_res_partnerone2many, many2many

A child list that saves its parent before letting you add a row. Seven lines of code for a problem that otherwise produces confusing errors on brand new contacts.

Read the guide
autosave_many2many_tax_tagsmany2many

Taxes on a journal entry line are not just a value, they generate other lines. This widget saves the whole entry the moment they change, so the tax lines appear immediately instead of at the end.

Read the guide
char_with_placeholder_fieldchar, text

A char field that never looks empty: <code>char_with_placeholder_field</code> shows the placeholder as a muted value, so users see the default Odoo will apply before it is applied.

Read the guide
char_with_placeholder_field_to_checkchar, text

The widget behind Odoo 19's <strong>To review</strong> pill on journal entry lists: a char field that flags posted, unreviewed entries to accountants, and quietly disappears again in Odoo 20.

Read the guide
confirm_booleanboolean

A switch that stops and asks before it loses data. It only asks in one direction, and once you confirm it saves straight away rather than waiting for the form.

Read the guide
dynamic_selectionselection

A selection field always offers every value it declares, unless you render it with <code>dynamic_selection</code>, the small account-module widget that shows only the options another field on the record allows. Odoo's e-invoicing localizations run on it.

Read the guide
grouped_view_widgettext (JSON string)

The <strong>grouped_view_widget</strong> renders a read-only, grouped table from a JSON string, and it is how the Accrued Orders wizard shows you the entries it is about to book before you commit.

Read the guide
l10n_ro_edi_stock_document_stateselection, many2one

Romania's e-Transport replies can be one error or ten. <code>l10n_ro_edi_stock_document_state</code> takes Odoo's document state widget and reformats the popover: single messages stay plain, multiple errors become a bulleted list.

Read the guide
line_open_move_widgetmany2one

A many2one field whose internal-link arrow does not open the record you expect, on purpose: <strong>line_open_move_widget</strong> routes analytic lines to the journal item's real business document.

Read the guide
list_activityone2many (always activity_ids)

The <strong>Next Activity</strong> column in Odoo list views, the little clock with a summary next to it, is the <code>list_activity</code> widget. It has no options at all; everything it shows comes from six activity fields it loads for you.

Read the guide
mail_attachmentsjson

The attachment list on Odoo's invoice send wizard. It knows the difference between a file you added, a file the system generated, and a file that must not be deleted, and it cleans up after itself when you close the wizard.

Read the guide
mail_composer_template_selectormany2one (mail.template; the descriptor declares no supportedTypes)

The small three dot Templates button in Odoo's email composer footer is the <code>mail_composer_template_selector</code> widget. It loads your templates first, shared ones second, and quietly hides its management entries when a context key says so.

Read the guide
many2many_tags_banksmany2many, one2many

Partner bank accounts rendered as tags, each showing whether outgoing payments are allowed. It also saves the partner behind your back, and there is a good reason for that.

Read the guide
many2many_tags_journalsmany2many

The <strong>many2many_tags_journals</strong> 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.

Read the guide
many2many_tax_tagsmany2many, one2many

<code>many2many_tax_tags</code> is the tags widget tuned for accounting: identical options, one deliberate change, the dropdown <strong>always offers Search More</strong>, because tax grids are long and picking the wrong one is a filing error.

Read the guide
nemhandel_verification_codechar

Six single character boxes for the code sent by SMS, with focus that moves as you type and a paste handler that fills the rest from wherever you started.

Read the guide
open_move_widgetchar

The <strong>open_move_widget</strong> turns the Journal Entry number in an items list into a link that jumps straight to the entry's best business view, an invoice, a payment or the raw journal entry.

Read the guide
paymentbinary (JSON payload)

Every <em>Paid on</em> line and every <em>Outstanding credits</em> box on an Odoo invoice is one widget: <strong>payment</strong>, a JSON-driven display with two faces, an info popover, and an Unreconcile button.

Read the guide
product_label_section_and_note_fieldmany2one

On an Odoo invoice line the Product column secretly edits two fields at once: the <code>product_id</code> many2one and the line description. The <code>product_label_section_and_note_field</code> widget is what stitches them together, and it also styles section, subsection and note lines.

Read the guide
product_label_section_and_note_field_o2mone2many

The one2many widget that renders <strong>invoice and bill lines</strong> in Odoo 19: sections, notes, merged product labels, and a column layout that reconfigures itself depending on document type.

Read the guide
section_and_note_textchar, text (the description column of order and invoice lines)

On sale orders and invoices, one widget decides how the description cell edits: <code>section_and_note_text</code>, a tiny dispatcher that reads the line's <code>display_type</code>. The Odoo 20 branch removes it.

Read the guide
x2many_buttonsmany2many, one2many

The <strong>x2many buttons widget</strong> renders a relation as a short row of clickable record buttons. It powers the "this document might be a duplicate of" banner on invoices.

Read the guide

Human Resources28

accrual_levelsone2many

Accrual plans are the hardest thing to configure in Odoo Time Off, so Odoo stopped showing them as a list. <code>accrual_levels</code> draws them as a timeline you read like a sentence.

Read the guide
activity_exceptionselection (activity_exception_decoration)

That small orange or red icon that appears at the end of some list rows is the <code>activity_exception</code> widget: a zero-option renderer for the <code>activity_exception_decoration</code> field that stays invisible until a record needs attention.

Read the guide
background_imagebinary, many2one (inherited from the image field)

The large employee photo panel in Odoo HR is not the standard image widget: <code>background_image</code> inherits every image option but swaps the template for a bare, display-only <code>&lt;img&gt;</code> with no upload or delete controls.

Read the guide
boolean_radioboolean

New in Odoo 19: <code>boolean_radio</code> shows a boolean as two radio buttons whose labels are <strong>full translatable sentences harvested from elements in the same view</strong>. Skip either option and the widget refuses to mount.

Read the guide
boolean_toggle_loadboolean

A list toggle that writes two fields instead of one. The second is a technical flag telling the server which level triggered the change, which its own comment explains.

Read the guide
checkboxboolean

Odoo 19's own views write <code>widget="checkbox"</code>, yet no such widget exists in the registry. This page explains the <strong>Missing widget</strong> console warning, the fallback that renders anyway, and what to use instead.

Read the guide
daterangedate, datetime

Time off requests, events and planned tasks all edit two dates in one calendar popover. That is the <code>daterange</code> widget: one field element, a paired date field, and more options than any other date widget in Odoo.

Read the guide
datetimedatetime

The <code>datetime</code> widget renders every Date &amp; Time field in Odoo. It is one of the rare widgets Studio exposes almost completely, and it hides an undocumented range-pairing ability.

Read the guide
day_selectionselection

In time off accrual plans, Odoo lets you say on the 30th of April but never on the 31st. That guard is <code>day_selection</code>, an <code>hr_holidays</code> widget that trims a day dropdown to the days its companion month actually has.

Read the guide
float_time_selectionfloat

Time off "custom hours" in Odoo use <code>float_time_selection</code>: a float field dressed as a clock time, with an hour and minute dropdown popover and locale-aware display.

Read the guide
float_without_trailing_zerosfloat, monetary

Odoo's accrual plans say "1 day", not "1.00 days". <code>float_without_trailing_zeros</code> does that trimming with one regex, and since Odoo 19 the core float widget can nearly replace it.

Read the guide
formatted_datedate

New in Odoo 19, <code>formatted_date</code> is a display-only date widget with per-view format control: month names instead of numbers, conditional colors from record data, and the label <strong>Indefinite</strong> when the date is empty.

Read the guide
hr_presence_statusselection (the hr_icon_display field)

The colored dot next to every employee, green for present, hollow for archived, a plane when on leave, is <code>hr_presence_status</code>. One tiny widget, layered by three modules, with a pill-shaped form variant that is new in Odoo 19.

Read the guide
many2many_avatar_employeemany2many

Employee pickers in Odoo HR render as avatar pills through <code>many2many_avatar_employee</code>, a widget whose defining trick is deciding <em>which employee model</em> you are really looking at.

Read the guide
many2many_tags_skillsmany2many

Skills rendered as tags that also carry whether the level is the default one. The extra data is injected rather than requested, so the view stays simple.

Read the guide
many2one_avatar_employeemany2one (hr.employee / hr.employee.public)

The employee picker with a photo: <code>many2one_avatar_employee</code> renders an employee link as an avatar, and quietly enforces HR privacy by <strong>switching the model it reads</strong> based on the user's rights.

Read the guide
many2one_tags_skillsone2many

A one-to-many rendered as clickable tags, with its own Select Skills dialog. Its registered name says many2one, its class says one2many, and the class is right.

Read the guide
many2one_work_entry_typemany2one

In payroll's work entry views, every type shows a small colored code chip (ATT, OT, SL) in front of its name. That chip is <code>many2one_work_entry_type</code>, an <code>hr_work_entry</code> widget that fetches and renders the type's short code and calendar color everywhere, dropdown included.

Read the guide
project_task_progressbarfloat (a 0 to 1 fraction), integer

The bar that shifts from green to orange to red as a task eats its allocated hours is <code>project_task_progressbar</code>: a fork of the standard progress bar that multiplies by 100 and colors itself by fixed thresholds.

Read the guide
radio_followed_by_elementselection, many2one

New in Odoo 19: <code>radio_followed_by_element</code> physically moves other form elements so they sit inline after a chosen radio option. It powers the accrual plan sentences in Time Off, and it is the most DOM-invasive field widget in core.

Read the guide
skill_match_gauge_fieldinteger (core); no supportedTypes declared

New in Odoo 19 Recruitment: the half doughnut scoring a candidate against a job is <code>skill_match_gauge_field</code>. It reads the job from the <strong>action context</strong>, prints the score inside the arc, and goes green when a candidate beats 100 percent.

Read the guide
skills_one2manyone2many, many2many

The skills block on an Odoo employee form is not a normal one2many list. <code>skills_one2many</code> ships its own renderer with hardcoded grouping, permission checks, and a report shortcut.

Read the guide
task_with_hoursmany2one (project.task)

On timesheet lines, the task dropdown shows each task's remaining allocated hours while you search, then hides them once you pick. That is the <code>task_with_hours</code> widget from <code>hr_timesheet</code>.

Read the guide
timesheet_duration_uomfloat

The same number is 7.5 hours or 0.94 days depending on how your company records time. This widget picks the right renderer, and swaps in an hours-only variant when the setting says time.

Read the guide
timesheet_uomfloat

<code>timesheet_uom</code> is a dispatcher: it renders every timesheet duration with whichever widget matches your company's <strong>timesheet encoding unit</strong>, hh:mm for hours, a toggle for days.

Read the guide
timesheet_uom_no_togglefloat

The quieter sibling of <code>timesheet_uom</code>: same per-company unit handling, minus the clickable toggle. <strong>timesheet_uom_no_toggle</strong> exists for the screens where that button would edit data it should not.

Read the guide
versions_timelineone2many

A document's earlier versions, shown as a timeline rather than a table, with each entry restorable or downloadable.

Read the guide
work_permit_uploadbinary

The binary field with a different template, used for an employee's work permit. Nothing else changes, and on the next branch it does not exist at all.

Read the guide

Discuss / Productivity13

activity_model_selectorchar

Choose a model, then choose a record: the two-step picker on the Schedule Activity wizard. Its cleverest part is protecting the summary you already typed from being wiped by the model change.

Read the guide
datetime-pickernone (attaches to an HTML input, not a record field)

Despite the name, <code>datetime-picker</code> is not something you put in a <code>widget=</code> attribute on a form view. It is a website side interaction that upgrades any frontend <code>&lt;input&gt;</code> carrying <code>data-widget="datetime-picker"</code> into Odoo's calendar picker.

Read the guide
html_composer_messagehtml

The rich text area of Odoo's full email composer is its own field widget. <code>html_composer_message</code> tunes the HTML editor for writing messages: mentions, collapsed quotes, batch-only placeholders, and attachment syncing.

Read the guide
html_mailhtml

The editor behind Odoo's email bodies. <strong>html_mail</strong> is the html field retuned for mail clients: styles inlined on save, layouts email clients cannot render stripped out.

Read the guide
mail_composer_attachment_listmany2many (ir.attachment)

The attachment rows under Odoo's email composer are the <code>mail_composer_attachment_list</code> widget: a stripped-down <a href="/odoo-widgets/many2many_binary/">many2many_binary</a> that lists, opens and deletes, but never uploads.

Read the guide
mail_server_configurator_selectionselection

New in Odoo 19, the <strong>mail_server_configurator_selection</strong> widget turns a plain selection into the per-user outgoing mail server setup: pick Gmail or Outlook, run the OAuth flow, and test the connection, all from user Preferences.

Read the guide
many2many_tags_emailmany2many, one2many

The <strong>email tags field</strong> is the recipient picker behind Odoo's share and invite dialogs: partner pills that show emails, accept <em>Name &lt;email&gt;</em> input, and can fix a bad address inline.

Read the guide
many2one_avatar_usermany2one

The assignee field with a face: <code>many2one_avatar_user</code> renders a user link as an avatar with online presence and chat access, and wires up the <strong>Assign to me</strong> command.

Read the guide
radio_selection_with_filterselection

Radio buttons that show only the choices this record is actually allowed to make. Small idea, and in Odoo 19 it changed contract in a way that silently breaks Odoo 18 views.

Read the guide
selection_badge_iconsmany2one

The activity scheduling dialog in Odoo 19 picks the activity type from icon-labeled badges. That row of buttons is <code>selection_badge_icons</code>, a many2one-only twist on <a href="/odoo-widgets/selection_badge/">selection_badge</a>.

Read the guide
shortcutchar

Odoo 19's <code>shortcut</code> widget dresses a plain char field with a fixed <code>::</code> prefix, so the canned response form reads exactly like what users will type in the Discuss composer.

Read the guide
sms_widgettext, char, html (inherited from the text field)

The message box in Odoo's Send SMS dialog does live math while you type: <code>sms_widget</code> detects the character encoding, counts the characters, and tells you how many SMS segments, and therefore credits, the message will cost.

Read the guide
text_scheduled_datechar, text

New in Odoo 19, the <strong>text_scheduled_date</strong> widget renders the composer's Send Later button: a clock that opens a dialog with preset slots and a custom picker, then stores the choice in the wizard's <code>scheduled_date</code> field.

Read the guide

Sales / CRM12

badge_rottingmany2one (stage field)

The <code>badge_rotting</code> widget renders a stage column that carries a red <strong>12d</strong> pill when the record has been sitting in that stage too long. It is the list-view member of Odoo 19's rotting family.

Read the guide
loyalty_data_fieldjson

The loyalty summary on a sale order: points, rewards, whatever the server computed. It is a display with no options at all, and it does not survive into the next version.

Read the guide
loyalty_one2manyone2many, many2many

The Rules and Rewards blocks on an Odoo loyalty program form look custom, but <code>loyalty_one2many</code> is just the standard x2many widget wearing a different template: a heading with the field label and an always present Add button.

Read the guide
many2one_avatar_leader_usermany2one (res.users)

A user picker that knows who runs the team: <code>many2one_avatar_leader_user</code> renders the standard avatar dropdown and marks the selected sales team's leader with a <strong>(Team Leader)</strong> tag.

Read the guide
quotation_document_many2manymany2many, one2many

The upload area for the PDF pages Odoo wraps around a quotation. It borrows the product document kanban wholesale and changes three things: where uploads go, what they attach to, and that only PDFs are accepted.

Read the guide
res_partner_many2onemany2one (to res.partner)

Type three letters into a customer field and Odoo suggests real companies with their logo, address and VAT. That is <code>res_partner_many2one</code>: a standard many2one wrapped with Odoo's company autocomplete service. It lives in a module most people have never looked at.

Read the guide
rottinginteger (placed on rotting_days)

Odoo 19 marks records that sit too long in a pipeline stage as <strong>rotting</strong>. The <code>rotting</code> widget is the red day-count badge that appears on their kanban cards.

Read the guide
rotting_statusbar_durationmany2one (stage field)

The <code>rotting_statusbar_duration</code> widget is the Odoo 19 form statusbar that shows how long a record spent in each stage and warns, on hover, when the record has gone stale.

Read the guide
so_line_create_buttonmany2one (sale.order.line)

On a billable project task, the Sales Order Item field carries a small plus button. That is <code>so_line_create_button</code>: a many2one that can spawn a whole sales order in a dialog and wire the task to its first service line automatically.

Read the guide
so_line_fieldmany2one

The <strong>Sales Order Item</strong> column on Odoo timesheets is rendered by <code>so_line_field</code>, a many2one variant that quietly records whether a human picked the item. Here is what it actually does.

Read the guide
sol_o2mone2many

The order lines table on every Odoo quotation. Most of what it adds to the generic sectioned list is one feature: making combo products behave like a single line that happens to have parts.

Read the guide
sol_product_many2onemany2one

Every product you pick on an Odoo quotation goes through <strong>sol_product_many2one</strong>: the widget that decides whether you get a plain product, a variant configurator, a combo picker, or a grid.

Read the guide

Inventory / Purchase14

datedate

Every date field in Odoo renders through the <strong>Date</strong> widget. Here is its full option set as shipped in the source: accepted date limits, future warnings, picker precision, display format, and the range pairing the documentation never mentions.

Read the guide
forecast_widgetfloat (inherits the float descriptor; core uses it on forecast_availability)

The green <strong>Available</strong>, orange <strong>Exp</strong> date and red <strong>Not Available</strong> pills on Odoo transfer lines are one widget reading five fields you cannot see. Here is exactly how <code>forecast_widget</code> decides which badge you get.

Read the guide
many2many_alt_posmany2many

The list of competing quotations on a purchase order. It marks the one you are looking at, refuses to reopen it, and opens the others in the same window so the breadcrumb keeps growing.

Read the guide
many2one_uommany2one (uom.uom)

The unit dropdown on order and move lines is <code>many2one_uom</code>: a many2one that knows <strong>which product the line carries</strong> and offers the units that make sense for it.

Read the guide
open_match_line_widgetany

A cell whose only job is to open the matching line it sits on. Model and method are both written into the widget, which makes it precise and completely non-portable.

Read the guide
package_m2omany2one

The many2one that Inventory uses for packages. <strong>package_m2o</strong> looks like a plain relation field until you notice the names it displays change with the transfer's state and context.

Read the guide
pick_frommany2one (stock.quant)

The Pick From column on Odoo's detailed operations tells a warehouse worker exactly which location, lot and package to take stock from. The <code>pick_from</code> widget is a many2one over <code>stock.quant</code> that fakes its display name when the quant is not set.

Read the guide
picking_type_dashboard_graphtext (holding a JSON payload)

The six little bars on every Odoo Inventory Overview card, late, yesterday, today, the next days, are the <code>picking_type_dashboard_graph</code> widget. Each bar is clickable and filters the transfer list to its exact date bucket.

Read the guide
pol_product_many2onemany2one

The product field on a purchase order line. Pick a product with one variant and it fills in; pick one with several and a grid opens.

Read the guide
replenishment_graph_widgetchar

The saw-tooth stock curve on a reordering rule, drawn against its minimum and maximum lines. New in Odoo 19, and it replaced a widget that showed history instead of a forecast.

Read the guide
stock.forced_placeholdermany2one

On Odoo's replenishment screen, an empty Route cell still tells you which route <em>would</em> apply. That is <code>stock.forced_placeholder</code>: a many2one whose placeholder text survives where the standard widget would show nothing.

Read the guide
stock_action_fieldfloat, monetary

A quantity or an amount that is also a link. Click the On Hand figure on a product list and it opens the stock view for that product, with context.

Read the guide
stock_picking_many2manymany2many

The transfers list on a wave. Adding one does not link a record directly: it opens a selection, creates a wizard, and lets the server attach them properly.

Read the guide
stock_rescheduling_popoverchar (holding JSON)

The red triangle next to a transfer's scheduled date is a widget: <code>stock_rescheduling_popover</code> reads a JSON field and lists the late upstream documents that put the date at risk.

Read the guide

Other / Misc2

Project / Timesheet10

many2many_avatar_usermany2many, one2many

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

Read the guide
name_with_subtask_countchar

The <em>(2/5 sub-tasks)</em> suffix on task names in Odoo project lists comes from <code>name_with_subtask_count</code>, a char widget with auto-loaded counters and a surprising history.

Read the guide
notebook_task_one2manyone2many

A task list rendered inside a notebook tab, with its own renderer and one adjustment: a kanban card opens the task rather than a dialog.

Read the guide
priority_switchselection

Project tasks use <code>priority_switch</code>, not the plain <code>priority</code> widget. The stars look identical; the difference lives entirely in the command palette.

Read the guide
projectmany2one

On an Odoo task form the project field is not a plain dropdown: the <code>project</code> widget wraps the standard many2one and shows a gray <strong>Private</strong> placeholder when the task belongs to nobody's project. Small widget, one hardcoded assumption worth knowing.

Read the guide
project_is_favoriteboolean

The star on every Odoo project card is not the plain favorite widget. <code>project_is_favorite</code> exists for one reason: letting users star projects they are not allowed to edit.

Read the guide
project_task_state_selectionselection

The <strong>task state selector</strong> is the colored status bubble on every Odoo task: In Progress, Changes Requested, Approved, Done or Canceled, with click behavior that adapts to where you are.

Read the guide
status_with_colorselection

The green On Track and red Off Track bubbles on Odoo project cards come from <code>status_with_color</code>, a project module widget that maps five health values to five fixed bubble colors. Its two knobs are attributes, not options, and Odoo 20 replaces both.

Read the guide
subtasks_one2manyone2many

The sub-tasks list on a project task. Its distinguishing behavior is what it does not pass on: when a sub-task opens, only a filtered set of context keys travels with it.

Read the guide
todo_done_checkmarkselection

Odoo's personal to-dos mark completion with a single circled check. <code>todo_done_checkmark</code> is a <code>state_selection</code> in disguise, with two pieces of memory the source docs never mention.

Read the guide

Point of Sale2

Manufacturing / Maintenance5

View-level26

account_file_uploader

The <strong>Upload</strong> action on the Accounting dashboard is a view widget: <code>account_file_uploader</code>. It files whatever you drop as attachments, then asks the journal to turn them into draft invoices or bills.

Read the guide
account_onboarding

The accounting onboarding checklist, drawn from a JSON payload already attached to the journal rather than from a separate query.

Read the guide
account_pick_currency_date

A date picker beside an invoice's exchange rate. Pick a date, and the rate for that date is fetched from the server and saved.

Read the guide
bill_upload_guide

The panel that offers three ways to get a bill into Odoo: upload a file, email it to an alias, or type one in.

Read the guide
button_new_contract

A button that asks for a start date, checks twice that the date is legitimate, then creates the contract and loads it.

Read the guide
calendar_connect_provider

One button that saves the settings, prepares the provider, restarts synchronization and sends you to the consent screen if needed.

Read the guide
calendar_week_days

The seven weekday toggles on a recurring event. The same widget the base framework provides, with a calendar template and a direct write on change.

Read the guide
customContentKanbanLikeWidget

The card grid for building a quotation PDF: pick headers, per-line documents and footers, and fill the form fields inside them.

Read the guide
documentation_link

Every <strong>Documentation</strong> arrow link in Odoo's Settings pages is one view widget: <code>documentation_link</code>. Its best trick is picking the right docs version for your server automatically.

Read the guide
form_page_dependencies

The what-links-here indicator for a website page, resolving the target model from the record before it asks.

Read the guide
hr_leave_stats

Two lists on a time off request: what this employee has already taken this year, and who else in their department is away over the same dates.

Read the guide
iap_buy_more_creditsnone (view widget)

The <strong>Buy Credits</strong> links under Odoo's SMS, lead enrichment and snailmail settings are one reusable view widget: <code>iap_buy_more_credits</code>, driven entirely by two attributes.

Read the guide
import_lots

The button for the other source of numbers: paste the supplier's list rather than generating your own.

Read the guide
mail_activity_mixin_list_reschedule_dropdown

The same three-option dropdown, on a list of leads or tasks rather than activities. It moves your next activity on that record.

Read the guide
mo_view_list_dropdown

A per-row dropdown that acts on the whole selection when there is one, and quietly skips work orders it should not move.

Read the guide
pls_tooltip_button

The button that explains a lead's win probability: a progress wheel, the three factors helping it and the three hurting it.

Read the guide
point_of_sale_test_epos

New in Odoo 19, the <strong>Test</strong> button next to your Epson ePOS settings is a view widget. <code>point_of_sale_test_epos</code> fires a real receipt at the printer and translates Epson's cryptic error codes into readable advice.

Read the guide
pos_cashdro_admin_buttons

Two buttons on the CashDro settings: download the bus worker logs, and open the machine's own diagnostics page.

Read the guide
pos_glory_cash_admin_buttons

A live connection status for a Glory cash machine, plus three actions: reset it, download the logs, or open its admin page.

Read the guide
pos_payment_provider_cards

A card per payment terminal provider, showing whether its module is installed, with install and setup in the same place.

Read the guide
purchase_file_uploader

Upload a bill against one purchase order or a selection of them, with a check that they all belong to the same vendor.

Read the guide
signature

The <strong>Sign</strong> button on Odoo delivery orders is the <code>signature</code> view widget: a button that opens the drawing dialog and writes the image straight into a binary field. Not to be confused with the field widget that shares its name.

Read the guide
subtask_kanban_list

The open sub-tasks on a task's kanban card, each with an editable state, plus an inline field for adding another.

Read the guide
survey_question_trigger

The icon beside a survey question that says whether its conditional display will actually work, computed live from the list rather than from saved data.

Read the guide
todo_chatter_panel

The chatter for a to-do, hidden by default on large screens and shown on small ones, toggled from elsewhere in the interface.

Read the guide
web_ribbon

The corner banner on Odoo forms, <strong>Archived</strong>, <strong>Paid</strong>, <strong>Cancelled</strong>, is one reusable view widget: <code>web_ribbon</code>. It takes three attributes, and one undocumented sizing rule.

Read the guide

Need this implemented in your Odoo?

We customize, migrate, and support Odoo for companies worldwide — from a single tricky view to a full implementation.

Book a free consultation