sol_product_many2one
Every product you pick on an Odoo quotation goes through sol_product_many2one: the widget that decides whether you get a plain product, a variant configurator, a combo picker, or a grid.
| Technical name | sol_product_many2one |
|---|---|
| Field types | many2one |
| Views | form (embedded order line list) |
| Module | sale, extended by event, rental and matrix modules |
| Used in core | 2 occurrences in 1 module: the product and product template columns of the quotation's order line list |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | No. It is wired into the sale views; Studio does not expose it as a choice |
| Alternatives | product_label_section_and_note_field, many2one, product_label_section_and_note_field_o2m, so_line_field |
What the sale product widget does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
no_create | boolean | Inherited from many2one. Stops reps from creating products from the quote; the option sales admins most often add here. |
no_open | boolean | Inherited from many2one. Suppresses the product link. Note the widget forces the link back on when the line is readonly, by design. |
no_quick_create | boolean | Inherited from many2one. Removes inline creation only. |
no_create_edit | boolean | Inherited from many2one. Removes the Create and Edit dialog entry only. |
search_threshold | number | Inherited from many2one. Delays catalog search until this many characters are typed; useful on large catalogs. |
placeholder_field | field name | Inherited from many2one. Dynamic placeholder sourced from another field on the line. |
show_label_warning | boolean | Inherited from the label base widget. Highlights lines whose label lacks a product; the sale widget extends the same highlight to product-less normal lines regardless.(default: false) |
The five fieldDependencies are new in 19 and matter for custom views. is_configurable_product, product_type, service_tracking, product_template_attribute_value_ids and translated_product_name are auto-loaded wherever the widget appears. On 17 and 18 the views had to load these flags themselves, so a custom 18 view copied to 19 may carry now-redundant invisible fields, harmless, but safe to clean up.
Working examples
Guards, parallel writes and combo bookkeeping
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | In development | Not released. Same widget; file moved and configurator logic extracted to a shared mixin on the development branch. Re-verified after launch. |
| Odoo 19.0 | Verified | Field dependencies, translated product name handling and the parallel apply path verified against the shipped source. |
| Odoo 18.0 | Verified | Rebased onto the product label and section base; combo configurator added. Views must load helper fields themselves. |
| Odoo 17.0 | Partial / changed | Plain many2one subclass with variant configurator flows; no label merging, no combos. |
| Odoo 16.0 | Partial / changed | Original class-registered version; configurator flows present, modern option handling absent. |
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| The configurator opens for products that should not need it | The template is marked configurable or carries attribute lines with choices. Fix the product template; single-variant templates resolve silently by design. |
| Configurator reopens after saving it | A custom override updates product_id outside the internal-update guard. Route programmatic product writes through record.update outside the widget, or replicate the isInternalUpdate flag. |
| Optional products land at the bottom instead of under the line | A customization re-sorts order_line or overrides _prepareNewLineData without preserving the insertion index. Keep the index math from the save handler when overriding. |
| Combo child lines survive a product change | The selected_combo_items JSON was not cleared because the change bypassed the widget's update path. Change combo products through the UI or clear selected_combo_items in your code first. |
| Product not clickable on a confirmed order | The line is still editable; the link only forces itself on when the line or order_line list is readonly. Expected. Lock the order to get the link, or open the product from its name in the catalog. |
| Missing flags errors in a custom 18-style view on 19 | Nothing missing anymore: 19 auto-loads the five dependencies, and stale invisible fields sometimes shadow them with different attributes. Remove manually added helper fields and let fieldDependencies load them. |
Sale product widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
sol_product_many2one | The product cell on sale order lines | Chains the m2o into variant, combo and grid configurators with an internal-update guard and sale-specific labels |
| product_label_section_and_note_field | Product cells on invoices and documents without configurators | Same label and section behavior, none of the configurator chaining |
| many2one | Any plain relation column | No product intelligence at all; picking a configurable template just stores it |
| product_label_section_and_note_field_o2m | The grid around these cells on invoices | The one2many renderer companion, not the cell widget |
| so_line_field | Referencing sale lines from other apps | Displays sale order lines with sale-aware naming instead of products |
Frequently asked questions
When does sol_product_many2one open a configurator instead of just setting the product?+
Why does the quotation use product_template_id instead of product_id?+
Which fields does the widget load automatically in Odoo 19?+
How do optional products end up as separate lines?+
Why can I still click the product on a locked sale order?+
What breaks when Odoo 20 arrives?+
Can I stop salespeople from creating products from the order line?+
Quotes stalling in the configurator?
Variant setups, combo menus, optional product upsells and matrix grids all route through this one widget, and catalog configuration decides whether it helps or interrupts. We tune Odoo sales catalogs and extend the configurator flow for teams on 16 through 19.
Streamline my quoting flow