Skip to main content
iVentureTeam

open_move_widget

The open_move_widget 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.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 25, 2026Updated August 25, 20265 min read
Technical nameopen_move_widget
Field typeschar
Viewslist
Moduleaccount, installed with Invoicing or Accounting
Used in core2 occurrences in 1 module: the Journal Items and Payment Items lists on account.move.line
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. Applied in view XML only; Studio has no toggle for it
Alternativesline_open_move_widget, many2one, x2many_buttons

What the open move widget does

The Journal Items list is where accountants live during a close, and every line on it belongs to a journal entry. The open_move_widget makes the move_name column a navigation device: instead of a plain text cell it renders an anchor with the entry number, and clicking it executes the server action action_open_business_doc on that line.

That server method is the clever part. It does not open the raw account.move form blindly; it resolves the most useful representation of the document. A line that belongs to a customer invoice opens the invoice form, a payment line opens the payment, and a manual entry opens the journal entry itself. The widget contributes exactly one thing, the click; all routing intelligence lives server side.

The template is a single anchor: <a href="#" t-out="value || '/'">. When the field is empty the widget prints /, which mirrors the placeholder number Odoo gives entries before they are posted, so unposted lines still show something clickable.

What this means for your team

The value is navigation speed during reconciliation and audit work. A controller scanning thousands of journal items does not want a three-click detour through the entry form to see the invoice behind a line. One click on the entry number lands on the business document, and the browser back button returns to the filtered list exactly as it was.

There is a subtle discipline benefit too. The Journal Items list is editable with multi-edit enabled, which is powerful and slightly dangerous. Because this widget renders a link instead of an input, the entry number itself cannot be mass-edited from the list, while neighboring columns can. The widget quietly protects the one column that must never be bulk-changed by accident.

If your team has custom operational lists that reference accounting entries, stock valuation layers, custom reconciliation screens, this widget is a free, proven way to give them the same one-click drill-down instead of building a custom button. Wiring it into custom list views is routine Odoo view customization work.

Working examples

How core uses it (Journal Items list)

<list name="move_line_tree" create="false" edit="true" multi_edit="1">
    <field name="move_name" string="Journal Entry" widget="open_move_widget"/>
    <!-- other columns stay editable; this one becomes a link -->
</list>

Reusing it on a custom model

<field name="reference" widget="open_move_widget"/>

Since Odoo 17 the click runs action_open_business_doc on the view's own model with the current record's id. Your model therefore needs a method with that exact name returning an action; without it the click raises an RPC error. On account.move.line the method ships with core.

Why it works everywhere since 17, and did not in 16

The widget never edits anything. The component renders only the anchor, so there is no input element in any state. In an editable list the cell simply does not enter edit mode for this column. If you need the number editable somewhere, that somewhere is the entry form, not the list.

The click handler stops the row click. The anchor uses t-on-click.prevent.stop, so clicking the number does not also trigger the list row's own open behavior. You get exactly one navigation, to the business document.

The Odoo 16 version was hardwired. In 16 the component called action_open_business_doc with resModel: "account.move.line" baked in, and a second legacy implementation shipped alongside it for the old view engine. Odoo 17 replaced the hardcoded model with this.props.record.resModel and dropped the legacy file, which is what made the widget reusable outside accounting. From 18 the file has not changed at all; 18, 19 and the current development branch are byte-identical apart from a removed module pragma.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. The development branch is byte-identical to 19 apart from cosmetic template rewrites. Re-verified after launch.
Odoo 19.0VerifiedVerified against the shipped source; identical to 18.
Odoo 18.0VerifiedIdentical file apart from the removed odoo-module pragma.
Odoo 17.0VerifiedFirst generic version: the target model became the view's own model instead of hardcoded account.move.line.
Odoo 16.0Partial / changedWorks on account.move.line only; the model is hardcoded and a parallel legacy-view implementation ships alongside.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. We read the development branch directly rather than relying on release notes, with the usual caveat that the branch is unstable until feature freeze and this page gets re-verified against the shipped release.

For this widget the answer is short: nothing changes. The JavaScript is identical to Odoo 19, and the template's only edit is the framework-wide rewrite of expressions to the explicit this. prefix. Both core usages on the Journal Items and Payment Items lists are still in place. Custom views using the widget should migrate without any attention.

Common problems and fixes

SymptomCause and fix
Clicking the number raises an RPC error on a custom modelSince 17 the widget calls action_open_business_doc on the view's model, and your model does not define it. Implement action_open_business_doc returning an action dict, or use a many2one widget instead.
The column cannot be edited even though the list is editableThe widget renders only an anchor; there is no input in any state. Expected. Edit the number on the journal entry form if you must.
The cell shows a slash instead of a numberThe field is empty, typically a draft entry that has not been assigned a sequence number yet. Post the entry; the slash is the widget's designed empty-value display.
Clicking opens an invoice instead of the journal entryaction_open_business_doc resolves the most specific business document for the line. Expected. Open the entry from the invoice's Journal Entry smart link if you need the raw move.
Options passed in the view have no effectThe registration declares no options and no extractProps; everything is ignored. There is nothing to configure. Subclass the component for different behavior.

Open move widget vs the alternatives

WidgetBest forKey difference
open_move_widgetEntry-number columns in accounting item listsRenders a char value as a link that opens the line's business document via action_open_business_doc
line_open_move_widgetmany2one fields pointing at journal items, as on analytic linesFull many2one editor whose internal-link arrow performs the same business-doc jump
many2oneOrdinary relations where the standard form link is fineEditable relation field; opens the raw related form rather than a resolved business document
x2many_buttonsJumping to a set of related records shown as buttonsRenders up to a few records as buttons and also routes through action_open_business_doc

The choice is about what the cell is. If it is a stored relation, use a many2one-based widget so users get the standard internal-link affordance. If it is the record's own reference text and you want a smart jump, this widget is the lightest answer.

Frequently asked questions

What does open_move_widget actually do?+
It renders a char field, in core the move_name of a journal item, as a clickable link. The click calls the server method action_open_business_doc on the current record, which opens the most relevant document: the invoice for an invoice line, the payment for a payment line, or the journal entry itself for a manual one.
Which views use open_move_widget in standard Odoo?+
Two lists in the account module, both on account.move.line: the Journal Items list (view_move_line_tree) and the Payment Items list. Both are editable multi-edit lists, and in both the entry-number column becomes a link.
Does open_move_widget have any options?+
No. The registration is a bare component descriptor with no supported options, no supported types and no extractProps, so any options= dict in the XML is ignored entirely.
Can I use open_move_widget outside accounting?+
Since Odoo 17, yes. The widget calls action_open_business_doc on whatever model the view belongs to, so any model implementing that method works. In Odoo 16 the model was hardcoded to account.move.line, so reuse only became practical from 17.
Why does the column show / for some lines?+
The template prints value || '/'. Draft journal entries have no assigned number yet, so their lines show the same slash placeholder Odoo uses for unposted entries.
Will open_move_widget change in Odoo 20?+
The development branch shows no functional change: the JavaScript matches 19 exactly and only template expression syntax was modernized. As always with an unreleased branch, we re-verify after the September 2026 release.

Custom accounting lists that drill down like core?

One-click navigation from operational lists to the documents behind them is the difference between a report people trust and a spreadsheet they export. We build custom Odoo list views, drill-downs and accounting screens on every version from 16 to 19.

Get your views built right

How this page was produced

This page was verified by reading open_move_widget.js and open_move_widget.xml in the Odoo 19.0 account module, confirming both core usages in account_move_views.xml, and diffing the same files across the 16.0, 17.0, 18.0 branches and the public development branch for the version table. The click-through behavior was exercised on a clean Odoo 19 database, where the screenshot was captured. Corrections are welcome via our contact page.