many2many_alt_pos
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.
| Technical name | many2many_alt_pos |
|---|---|
| Field types | many2many |
| Views | form, with an embedded list |
| Module | purchase_requisition, the blanket order and alternatives app |
| Used in core | 1 occurrence, the alternatives tab of the purchase order form in purchase_requisition |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | No. It is tied to the alternatives relation on purchase orders |
| Alternatives | many2many, one2many, x2many_buttons, many2many_tags |
What the alternative orders list does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
quotation_only | context key | Set on the field's context in the core view. Restricts which purchase orders can be linked as alternatives. |
no_create | boolean | Forwarded to the embedded list as a CRUD setting. Prevents creating new orders from the alternatives list.(default: false) |
editable | string (list attribute) | Set on the embedded list. Governs inline editing of the linked rows. |
It forces many-to-many semantics. The widget overrides the check that decides whether the relation is owned or linked, always answering that it is linked. That is deliberate: an alternative is another document in its own right, not a child row, so adding or removing one should link and unlink rather than create and delete.
Working examples
Three overrides, and why one of them forces many-to-many
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | Partial / changed | Not released. Same widget name and behavior, but the file and its view move to a new purchase alternatives module. |
| Odoo 19.0 | Verified | Verified against the shipped source. |
| Odoo 18.0 | Verified | Same three overrides and the same navigation behavior. |
| Odoo 17.0 | Verified | Same behavior with the older component conventions. |
| Odoo 16.0 | Verified | Same behavior with the older component conventions. |
Upgrade note. The widget name and behavior are stable from Odoo 16 through Odoo 19, so views carry over. What changes in the next version is where it lives: the alternatives feature moves out of the blanket order module into a module of its own, so module dependencies and any inherited views declared against the old module need updating.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| Clicking a row does nothing | It is the record you are already on, which the widget deliberately refuses to reopen. Expected. The current row is marked; click a different one. |
| The current row is not marked | The row template that uses the current-record test was overridden. Keep the widget's own row template, or reimplement the marking in your override. |
| Opening an alternative loses the breadcrumb | Something is opening the record in a dialog rather than through the widget's handler. Check for a customization intercepting the row click. |
| The list offers to create purchase orders | The CRUD settings forwarded to the embedded list allow creation. Pass no_create in the options, as a comparison list rarely wants creation. |
| The field is read-only | The core view makes it read-only until the order has been saved. Save the purchase order first; alternatives are links and need a record to link from. |
| Missing widget error after upgrading | The widget moves to a new module in the next version. Install the new purchase alternatives module and update any dependency on the old one. |
Alternative orders list vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
many2many_alt_pos | Comparing competing quotations from inside any one of them | Marks the current record, refuses to reopen it, and navigates to the others in the same window |
| many2many | An ordinary linked list | No current-record marking and no controlled navigation |
| one2many | Owned child rows | Creates and deletes records rather than linking existing ones |
| x2many_buttons | A very compact relation | Buttons rather than a comparable list |
| many2many_tags | A short set of links | Tags, with no columns to compare across |
Frequently asked questions
Why does clicking one row do nothing?+
Why does it force many-to-many behavior?+
Why does opening an alternative keep the breadcrumb?+
Does it support any options?+
What changes in Odoo 20?+
Buying decisions made side by side, not in email
Calls for tenders, alternative quotations and supplier scoring all live in Odoo Purchase, and the setup decides whether buyers use it. We implement purchasing processes on Odoo 16 through 19.
Book a free consultation