Odoo Widgets Reference
313 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 / Web67
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 CopyClipboardCharcharOne 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 CopyClipboardURLcharShare 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_checkboxesjsonThe 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_imagemany2oneThe 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, charThe <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 base_automation_actions_one2manyone2manyA rule's actions shown as one horizontal strip that measures itself against the available width and hides what does not fit behind an <em>and 3 more</em> counter.
Read the guide base_automation_trigger_selectionselectionThe 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.
Read the guide binarybinaryThe 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 binary_spreadsheetbinaryThe 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.
Read the guide booleanbooleanThe 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_favoritebooleanThe 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_iconbooleanA 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_togglebooleanThe <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, textThe 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, htmlOne 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 colorcharThe <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_pickerintegerThe <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, many2oneNew 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 dashboard_graphtextThe 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.
Read the guide domainchar, textThe 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 emailcharThe <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_selectorcharThe <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, monetaryEvery 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_timefloatThe <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 gaugeinteger, floatThe <strong>gauge</strong> 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 <code>max_value_field</code> option is dead, and <code>max_field</code> is the one that works.
Read the guide google_slide_viewerchar, textPaste 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 handleintegerThe 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 htmlhtmlThe <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, htmlFor 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, many2oneThe <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 integerintegerThe <strong>Integer</strong> 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.
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_selectionselectionPaid 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, one2manyThe 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_binarymany2manySeveral 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_checkboxesmany2manyThe <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, one2manyThe 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, one2manyThe <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 many2onemany2oneThe 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_avatarmany2oneThe 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, integerThe <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, many2manyOrder 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_viewerbinaryA 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, integerThe <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, integerThe 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 phonecharPhone 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 priorityselectionThe 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, floatOdoo'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 propertiespropertiesThe <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, many2oneThe <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 referencereference, charOne field, two questions: which model, then which record. <code>reference</code> is the widget behind that pair of inputs, and it accepts far more options than it admits to.
Read the guide remaining_daysdate, datetimeThe 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_one2manyone2manyWorking 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, selectionThe 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, many2oneWhen 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_selectionselectionThe 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, many2oneThe 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, selectionThe 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, htmlOdoo'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 timezone_mismatchselectionA 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.
Read the guide tour_start_widgetchar, textThe <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_booleanbooleanThe 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 urlcharThe <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 guideWebsite / Marketing21
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, charThe 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_phonebooleanNew 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, textThe <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_one2manyone2manyThe 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 chatbot_triggering_answers_widgetmany2manyTags for the answers that trigger a chatbot step, filtered to the script you are editing. It does that by writing into the user's own context, which is an unusually blunt way to pass a filter.
Read the guide event_icon_selectionchar, text, selection<code>event_icon_selection</code> turns a field's value into an icon, and its configuration is unlike any other widget on this site: the <code>options</code> dictionary itself is the icon map, with every key you write becoming a supported value.
Read the guide event_state_selectionselectionEvents in Odoo carry a fourth kanban state, <strong>Cancelled</strong>, and <code>event_state_selection</code> is the widget built around it: icon-based states in a fixed order, a divider isolating the cancel action, and one surprising omission inherited from how it skips its parent's setup.
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 image_radioselectionA selection field rendered as clickable pictures. The images are matched to values <em>by position</em>, and the radio group has a hardcoded name, which is where both of its failure modes come from.
Read the guide mailing_filtermany2oneA relation picker with two extra icons: save the current recipient domain as a favorite, or drop the one you loaded. On the Odoo 20 development branch the whole idea is replaced.
Read the guide mass_mailing_htmlhtmlThe email designer inside Odoo: themes, snippets, an iframe preview and a code view. It is the rich text editor with several features deliberately switched off, because email is not the web.
Read the guide slide_category_one2manyone2many, many2manyThe content tab of an eLearning course is one relation pretending to be two: sections and lessons. This widget is the renderer that keeps them apart.
Read the guide stat_infonot applicableOne core view writes <code>widget="stat_info"</code> on a stat button. Nothing registers that name, and a button would not look it up even if something did. Two reasons for the same outcome: nothing happens.
Read the guide text_emojistext, charThe 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 video_previewhtml (core binds it to the computed embed_code field)The live video preview in Odoo's product media dialog is <code>video_preview</code>: a field widget that trusts a server-computed embed and simply frames it 16:9. All the intelligence, and all the platform support, lives server side.
Read the guide website_publish_buttonbooleanThe <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_buttonbooleanThe <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_urlscharOne 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_imagebinary, many2one (inherited from the image widget)The image tile in Odoo's product media kanban is not the plain <code>image</code> widget. <code>x2_many_image</code> swaps the file picker for the media dialog, and quietly disables three inherited options while doing it.
Read the guide x2_many_media_viewerone2many, many2manyThe <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 guideAccounting / Localization39
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_summaryjsonBefore 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, many2oneGovernment 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_merge_wizard_lines_one2manyone2manyMerging duplicate accounts means reading groups of candidates and ticking the ones to keep. This widget is the sectioned list that makes those groups legible, down to keeping one column deliberately visible.
Read the guide account_move_statusbar_securedselectionA padlock next to Posted, green when the entry is hash-secured and orange when it is not. One inherited status bar, three template edits, and an audit story you can see at a glance.
Read the guide account_payment_register_htmlhtmlThe line of text in the Register Payment wizard that offers to pay just the installment instead. It is server-generated HTML with one clickable class, and Odoo 19 threw away the editor it used to run through.
Read the guide account_resequence_widgettextRenumbering posted journal entries is not something you want to guess at. This widget draws the before and after list so the wizard can be read before it is run.
Read the guide account_tax_repartition_line_factor_percentfloatTax distributions sometimes have to be a third of something. This widget keeps twelve decimals so the arithmetic survives, then hides the trailing zeros so the screen stays readable.
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 & Loss</strong> headings so accountants pick from a structured tree instead of a 15 item flat list.
Read the guide actionable_errorsjsonThe <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_distributionjsonThe 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, many2manyA 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_tagsmany2manyTaxes 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, textA 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 confirm_booleanbooleanA 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_selectionselectionA 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_in_hsn_autocompletechar, textType three characters and Odoo asks India's GST portal for matching HSN codes. The request goes from the user's browser, not from your server, and that has consequences worth knowing before you deploy it.
Read the guide line_open_move_widgetmany2oneA 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_attachmentsjsonThe 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_attachments_selectorjsonThe upload control on Odoo's document send wizard. It routes files through the messaging layer rather than creating attachments directly, and every file it adds is marked so it can be cleaned up later.
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, one2manyPartner 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_journalsmany2manyThe <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 many2one_account_accountmany2onePicking an account is the most repeated action in Odoo accounting. This widget makes one change to the dropdown: it stops offering Search more unless you typed a number.
Read the guide nemhandel_verification_codecharSix 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_decimal_precision_buttonanyA field that is not really a field: a button in a warning panel that throws away your unsaved currency change and sends you to the setting you actually wanted.
Read the guide open_move_widgetcharThe <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 payment_term_line_idsone2many, many2manySixteen lines of code to fix one annoyance: a new payment term line vanishing because the user clicked somewhere else before typing anything.
Read the guide peppol_non_focusable_selectionselectionA selection widget whose entire purpose is to <em>not</em> take focus. One attribute changed in an inherited template, so the Peppol registration form can put the cursor where a user actually types.
Read the guide product_label_section_and_note_fieldmany2oneOn 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_o2mone2manyThe 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 receipt_selectorselectionThe small Invoice or Receipt toggle at the top of a journal entry. It rewrites its own labels, filters its own choices, and disappears entirely unless your database has sales receipts turned on.
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, one2manyThe <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 guideHuman Resources38
New in Odoo 19, <strong>RecruitmentCopyClipboardChar</strong> is a copy-to-clipboard field with a twist: instead of copying what is stored, it can call a server method at click time and copy whatever that returns, which is how recruitment source aliases are created on demand.
Read the guide accrual_levelsone2manyAccrual 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 applicant_charchar, textA text cell that is also a link. On the attachments list it shows which applicant a CV belongs to and takes you there, without needing the field to be a relation.
Read the guide applicant_line_many2manymany2manyApplicant tags with the job position in front of the name. On a refusal wizard covering several vacancies, that prefix is the difference between knowing who you are rejecting and guessing.
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><img></code> with no upload or delete controls.
Read the guide boolean_radiobooleanNew 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_loadbooleanA 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 checkboxbooleanOdoo 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, datetimeTime 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 datetimedatetimeThe <code>datetime</code> widget renders every Date & 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_selectionselectionIn 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_selectionfloatTime 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, monetaryOdoo'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_datedateNew 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_applicant_state_selectionselectionThe colored state bullet on an Odoo recruitment applicant is not the standard <code>state_selection</code> widget. <code>hr_applicant_state_selection</code> exists because <code>hr.applicant</code> carries a fourth kanban state, <strong>Waiting</strong>, that needed its own color.
Read the guide hr_holidays_radio_imagemany2one, selectionThe little row of illustrations on a Time Off type is a radio group in disguise. It builds each image path from the option's own label, and it is gone on the Odoo 20 development branch.
Read the guide hr_homeworking_radio_imageselectionThe building, house and map-marker radios on Odoo's work location form are <code>hr_homeworking_radio_image</code>, a radio widget whose template only knows three hardcoded values, ignores its own inherited option, and disappears entirely in the Odoo 20 branch.
Read the guide hr_org_chartany (the field's own value is ignored; core places it on a one2many)The organization chart on every Odoo employee form is one field widget: <code>hr_org_chart</code>. It ignores the field it sits on, calls its own controller, and caps the manager chain at five levels because of a one-line source comment.
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_employeemany2manyEmployee 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_avatar_employee_classmany2manyEmployee avatars with some of them flagged. It exists for one wizard, it takes its list of problem employees from a field you name, and on the development branch both the wizard and the widget are gone.
Read the guide many2many_tags_salary_bankmany2manyOn the employee form, bank account tags can read <strong>(30%) BNP Paribas ...1234</strong>. That prefix is <code>many2many_tags_salary_bank</code>, a tags widget that annotates each account with its salary split and quietly saves your whole form when you close a tag's dialog.
Read the guide many2many_tags_skillsmany2manySkills 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_skillsone2manyA 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_typemany2oneIn 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 nb_attachmentintegerA number and a paperclip: how many receipts are attached to an expense. Fifteen lines of code, and one detail worth knowing about when the number updates.
Read the guide project_task_progressbarfloat (a 0 to 1 fraction), integerThe 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, many2oneNew 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 resume_one2manyone2manyThe Resume block on an Odoo employee form, with its timeline dots, date ranges and grouped experience types, is <code>resume_one2many</code>. It is a heavily customized one2many renderer with a hardcoded grouping and one genuine rendering bug that Odoo 20 fixes.
Read the guide skill_match_gauge_fieldinteger (core); no supportedTypes declaredNew 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, many2manyThe 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_uomfloatThe 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_togglefloatThe 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_timelineone2manyA document's earlier versions, shown as a timeline rather than a table, with each entry restorable or downloadable.
Read the guide work_permit_uploadbinaryThe 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 guideDiscuss / Productivity20
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 boolean_update_flagbooleanA checkbox that also answers a second question: <em>did a human change this, or did the server?</em> <code>boolean_update_flag</code> exists because an onchange cannot tell the difference.
Read the guide calendar_event_notes_htmlhtmlThe rich text editor for meeting notes, with exactly one plugin taken out. In a narrow calendar panel, drag handles on every block were doing more harm than good.
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><input></code> carrying <code>data-widget="datetime-picker"</code> into Odoo's calendar picker.
Read the guide html_composer_messagehtmlThe 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_mailhtmlThe 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 integer_update_flagintegerThe numeric twin of <code>boolean_update_flag</code>: an integer input that also records whether a human, rather than a recalculation, moved the number. It has one sharp edge above 999.
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 many2many_tags_emailmany2many, one2manyThe <strong>email tags field</strong> is the recipient picker behind Odoo's share and invite dialogs: partner pills that show emails, accept <em>Name <email></em> input, and can fix a bad address inline.
Read the guide many2manyattendeemany2manyAttendee avatars with a tick, a cross or a question mark on each, plus flags for missing emails and people who are already busy. All of it from one server call the widget makes itself.
Read the guide many2manyattendeeexpandablemany2manyThe attendee widget again, with a collapse. In a calendar popover there is no room for thirty avatars, so it shows the counts and lets you open the list when you want it.
Read the guide many2one_avatar_usermany2oneThe 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 portal_wizard_user_one2manyone2manyThe Grant Access dialog is one of the few places in Odoo where a double click can send two invitation emails. <code>portal_wizard_user_one2many</code> is the twenty-line widget that stops it.
Read the guide question_page_one2manyone2many, many2manyThe survey question list looks like an ordinary embedded list until you add a section. <code>question_page_one2many</code> is the widget that makes sections behave, and it saves the whole survey behind your back on every edit.
Read the guide radio_selection_with_filterselectionRadio 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_iconsmany2oneThe 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 shortcutcharOdoo 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 survey_description_pagechar, textA text cell with two affordances bolted on: a button that opens the row, and a pencil marking section rows. Both depend on the widget around it, which is why it does nothing on its own.
Read the guide text_scheduled_datechar, textNew 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 guideSales / CRM14
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_fieldjsonThe 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, many2manyThe 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, one2manyThe 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_fieldmany2oneThe <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 so_template_line_o2mone2manyQuotation templates gained optional sections in Odoo 19, and this widget is what keeps them honest: move a line into one and its quantity becomes zero, move it out and the quantity comes back.
Read the guide sol_o2mone2manyThe 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_many2onemany2oneEvery 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 sol_texttext, charThe description cell on a quotation line. It behaves like the shared section and note text field everywhere except on a combo line, where it deliberately drops to a single line input.
Read the guideRelational7
New capability in Odoo 20, not a rename. It turns a many2one into a row of clickable badges, can put a different icon on each one, and keeps working when the connection drops.
Read the guide many2many_avatar_resourcemany2many (resource.resource)The x2many companion to the resource avatar widget. It marks machines with a wrench, shows a hover card only for people, and in kanban it renders the tags in reverse order.
Read the guide many2many_tags_color_dotmany2manyNew in Odoo 20. It renders tags as a colored dot next to a plain label rather than a filled pill, and it overrides the parent widget's click behavior through an option nobody declares.
Read the guide many2one_avatar_resourcemany2one (resource.resource)This widget renders a link to a <code>resource.resource</code> with an avatar, distinguishing a person from a machine. It also reads an option Odoo never declares, and its click behavior changes depending on the view you put it in.
Read the guide many2one_referencemany2one_referenceThe <code>many2one_reference</code> widget renders a reference field, where the target model lives in a second field, as an ordinary many2one picker. Leave that second field out of the view and it does not degrade: it throws.
Read the guide many2one_reference_integermany2one_referenceWhere <code>many2one_reference</code> resolves a reference into a record picker, <code>many2one_reference_integer</code> does the opposite: it shows you the bare database id and nothing else.
Read the guide section_and_note_one2manyone2manyThis is the widget behind order and invoice lines, the one that lets a line be a section or a note instead of a product. It reads four settings that appear in no option list.
Read the guideInventory / Purchase24
The counted quantity cell in a physical inventory. The hard part is not the number, it is knowing the difference between counted zero and not counted at all.
Read the guide datedateEvery 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 lead_days_widgetcharThe lead time breakdown on a reordering rule: supplier delay, purchase security, warehouse handling, all added up. It is a server-computed JSON payload rendered by a five line widget.
Read the guide many2many_alt_posmany2manyThe 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 mondialrelay_relaycharA carrier's own map, loaded from their servers into an Odoo form. It is one of the very few widgets in core that pulls a third-party script, and it comes with a hand-written workaround for that carrier's bug.
Read the guide monetary_no_zeromonetary<code>monetary_no_zero</code> is the standard <a href="/odoo-widgets/monetary/">monetary</a> widget with one refinement: amounts that round to zero in the currency's precision render as an empty cell instead of 0.00. Purchase built it to keep its bill matching list readable.
Read the guide move_product_label_fieldmany2oneThe product cell on a transfer line, with the delivery description tucked underneath it. Its most useful behavior is knowing when that description is worth showing at all.
Read the guide open_match_line_widgetanyA 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_m2mmany2manyPackage names as tags on a transfer line, plus a synthetic <em>No Package</em> tag for the lines that are not in one. It is deliberately display only, and the code makes sure of that.
Read the guide package_m2omany2oneThe 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_many2onemany2oneThe 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 popover_widgetcharAn icon in a cell that opens a popover when clicked, with the message, the icon, the color and the position all decided server side and shipped as JSON in a text field.
Read the guide replenishment_graph_widgetcharThe 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 sml_x2_manyone2many, many2manyThe detailed operations list on a stock move. Its Add a line does not create an empty row: it opens the quants that actually hold the product, filtered to what is left after the lines you have already typed.
Read the guide stock.forced_placeholdermany2oneOn 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, monetaryA 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_move_one2manyone2many, many2manyThe operations list on a transfer. Its distinguishing feature is a button that adds every line in a package at once, and it saves the whole picking before it can even offer that.
Read the guide stock_picking_many2manymany2manyThe 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 time_period_selectionselectionA selection whose labels are written when the page loads. Instead of "last year, month plus one" it says "February 2025", which is the difference between a setting people use and one they avoid.
Read the guideProject / Timesheet15
The blocking tasks list on a shared project task. It exists because the portal view is not the backend view, and the standard list renderer assumes things the portal cannot offer.
Read the guide many2many_avatar_usermany2many, one2manyThe <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_countcharThe <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_one2manyone2manyA 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_switchselectionProject 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 projectmany2oneOn 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_favoritebooleanThe 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_state_selectionselectionThe green, orange and red status bubble on an Odoo project is <code>project_state_selection</code>. It swaps the generic state colors for the five-color project palette, and quietly removes one status from the dropdown.
Read the guide project_task_state_selectionselectionThe <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_colorselectionThe 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 statusbar_durationmany2one<code>statusbar_duration</code> is the status bar that prints how long the record sat in every stage, fed by the chatter's tracking history. It only works on models that opt into a server-side mixin, and Odoo 20 rewrites its data contract.
Read the guide subtasks_one2manyone2manyThe 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 task_done_checkmarkbooleanA tick instead of a switch, with one rule worth knowing: in a list or a kanban it saves as soon as you click, and on a form it waits for you.
Read the guide task_stage_with_state_selectionmany2oneIn the task list view, the Stage column shows the stage name with the task's state bubble beside it. That pairing is <code>task_stage_with_state_selection</code>, a composite widget that renders two fields in one cell, and it is not the many2one widget it looks like.
Read the guide todo_done_checkmarkselectionOdoo'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 guideOther / Misc4
The little clock on every kanban card is <code>kanban_activity</code>: a 32-line widget that quietly fetches six extra fields and color-codes your follow-ups.
Read the guide lunch_is_favoritebooleanNine lines of code that exist for one reason: Odoo's lunch menu kanban is declared non-editable, and the favorite star still has to work.
Read the guide many2many_uom_tagsmany2manyNew in Odoo 19, <strong>many2many_uom_tags</strong> is the tags widget with unit awareness: its dropdown shows each unit of measure alongside what it converts to for the product at hand.
Read the guide pavs_one2manyone2manyThe values list on a product attribute. Deleting one asks the server whether anything is using it, and refuses outright if the answer is yes, before any confirmation is offered.
Read the guidePoint of Sale2
The tags widget with one thing changed: a template that shows a placeholder when the cell is empty, so a list column does not go blank.
Read the guide upgrade_selectionselectionA settings dropdown that only works on Enterprise. On Community it opens the upgrade dialog and, when that closes, puts the value back to a hardcoded default.
Read the guideManufacturing / Maintenance5
The remaining days widget with its badge taken off. Same relative dates, plain text, because a manufacturing list already has enough color in it.
Read the guide mrp_should_consumefloatThe component quantity with a second number beside it: what the bill of materials says you should have consumed for the quantity you are actually producing.
Read the guide mrp_timerfloatA duration that counts up while the operator is clocked on. It asks the server for the real elapsed time rather than trusting the stored value, then keeps ticking locally.
Read the guide mrp_workorder_popovercharAn icon on a work order that explains what is holding it up, with a button that replans it on the spot. Built on the inventory popover, and split in two on the next branch.
Read the guide workcenter_dashboard_graphtextThe load chart on a work center card. Three series over the same days: the capacity line, the load bars and, separately, the hours that exceed it.
Read the guideSelection & Status4
New in Odoo 20 and the replacement for <code>selection_badge</code>. It declares a single option and quietly reads four more, two of which do conditional choice filtering with no Python at all.
Read the guide hr_presence_status_privateselectionAn employee presence indicator that Odoo 19 registers for form views only. Odoo 20 both lifts that restriction and quietly changes how it looks.
Read the guide selection_badge_with_filterselectionIn Odoo 19 this widget shows a selection as badges filtered by another field's value. In Odoo 20 the same registration name belongs to a completely different widget, so the same XML does something else.
Read the guide work_entry_source_fieldselectionA radio field that knows one rule: a fully flexible calendar cannot use Working Hours as a work entry source. It warns the user rather than letting the server reject the save.
Read the guideText & Numeric6
A float field that reacts to a barcode scan by firing a synthetic input event on itself. It is four lines long, and Odoo 20 removes it.
Read the guide google_address_autocompletecharThis widget turns a street field into a Google Places search that fills the whole address block. Its seven field-mapping options are what make it usable on a model that does not name its fields the way <code>res.partner</code> does.
Read the guide partner_autocompletecharType a company name and this widget fills the rest of the partner record from Odoo's enrichment service. It also saves the record and posts a message, which is more than most widgets do.
Read the guide passwordchar, textThe <code>password</code> widget renders a char or text field as a masked input with a reveal button. It is a display convenience, not a security control: the real value is already in the browser.
Read the guide password_metercharThe <code>password_meter</code> widget scores a password against the policy your server actually enforces. It is the opposite of the <code>password</code> widget: it shows the value and rates it, rather than hiding it.
Read the guide sales_team_progressbarinteger, floatA kanban progress bar that turns into a call to action when there is nothing to measure. Odoo 20 and 19 removes it, and the kanban progress bar variant it was built on goes with it.
Read the guideDate & Time1
Boolean & Toggles2
New in Odoo 20, and it exists because the plain <code>boolean</code> widget stopped being predictable: in Odoo 20 it renders as a toggle on small screens and a checkbox on desktop.
Read the guide boolean_toggle_labeledbooleanA boolean toggle that renders its own label, and the only option it has is one Odoo 20 and 19 deleted from the entire field library. The widget went too.
Read the guideMedia & Files1
View-level36
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_onboardingThe 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_dateA 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 attach_documentThe <strong>Attach Receipt</strong> button on Odoo expenses is a reusable view widget: <code>attach_document</code>. It saves the record before it ever opens the file picker, and it can hand the uploaded files to any model method you name.
Read the guide bill_upload_guideThe 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_contractA 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_week_daysThe 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 colors_reset_buttonThe little refresh icon next to Odoo Livechat's color pickers is <code>colors_reset_button</code>: a one-click view widget that puts a set of fields back to the defaults you declare in the XML, and crashes if you forget to declare them.
Read the guide customContentKanbanLikeWidgetThe 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_linkEvery <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 generate_serialsThe button that generates a run of lot or serial numbers for a move, and writes the resulting lines in one go.
Read the guide hr_department_chartThe department's place in the org: parents above, children below, each clickable to open the employees inside it.
Read the guide hr_employee_chatThe speech-bubble icon beside an employee's name is <code>hr_employee_chat</code>: a one-icon view widget that drops you into a Discuss chat with that person, and that silently disappears when the employee has no user account.
Read the guide hr_leave_statsTwo 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_lotsThe button for the other source of numbers: paste the supplier's list rather than generating your own.
Read the guide internal_resume_linesNew in Odoo 19: <code>internal_resume_lines</code> writes the employee's internal career history for you, computed from version records, no manual resume entry required. It is the block titled with your company name above the editable resume.
Read the guide lna_checklistA checklist of local network access prerequisites whose ticks live in browser storage, not in the database, and are written when you save.
Read the guide mail_activity_list_reschedule_dropdownA compact dropdown on an activity row offering today, tomorrow and next week, with the server deciding what those actually mean.
Read the guide mail_activity_mixin_list_reschedule_dropdownThe 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_dropdownA 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 notification_alertThe banner warning that push notifications are blocked is the <code>notification_alert</code> view widget: twelve lines of code, one browser API check, and exactly one state in which it renders anything at all.
Read the guide pls_tooltip_buttonThe 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_eposNew 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_buttonsTwo 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_buttonsA 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_cardsA card per payment terminal provider, showing whether its module is installed, with install and setup in the same place.
Read the guide purchase_file_uploaderUpload 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 qty_at_date_widgetThe little chart icon on Odoo sale order lines is <code>qty_at_date_widget</code>: a stock-aware view widget that turns red when the line will not be fulfilled on time and opens the availability popover with a jump into the forecast report.
Read the guide signatureThe <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_counterTwo numbers on a task row, closed over total, that double as the control for expanding its sub-tasks.
Read the guide subtask_kanban_listThe 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_triggerThe 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_panelThe 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_ribbonThe 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 week_daysThe row of seven weekday checkboxes on Odoo's recurrence forms is the <code>week_days</code> view widget. It demands seven exact boolean fields on the model, and it reorders itself by the user's locale.
Read the guideSpecial & Technical7
The dropdown half of Odoo 20's additional identifiers pair. It offers only the types this partner has not used yet, in an order the server decides.
Read the guide additional_identifiers_listjsonNew in Odoo 20. It renders a partner's additional identifiers, tax and registration numbers, from a JSON field whose shape is described by a second, server-computed field.
Read the guide barcode_handlerany (undeclared)An invisible field that renders nothing and exists purely to catch barcode scans into a field. Odoo 20 removes it, and barcode handling moves out of the field layer entirely.
Read the guide code_ir_ui_viewtext, html<code>code_ir_ui_view</code> is the code editor Odoo puts on the <code>arch</code> field of the Views screen. It is the <code>ace</code> widget with a different editor component bolted on, and it is applied in a way a normal search will never find.
Read the guide contact_statisticsjsonThe <code>contact_statistics</code> widget renders a <code>json</code> field as a read-only list of statistics. It exists for one screen, the contact form, and it takes no configuration at all.
Read the guide profiling_qweb_viewtextThe <code>profiling_qweb_view</code> widget renders a stored profiling result as annotated QWeb source, with the time and query count for every directive written into the gutter.
Read the guide res_user_group_idsmany2many (res.groups)<code>res_user_group_ids</code> is the widget behind the access rights grid on the user form. It generates a whole form view at runtime from a hierarchy the server sends, which is why it works nowhere else.
Read the guideNeed 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