signature
The Sign button on Odoo delivery orders is the signature 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.
| Technical name | signature |
|---|---|
| Views | form (view widget, |
| Also registered as | signature in the fields registry is a different component (the drawing pad field widget) |
| Module | web, present in every Odoo database |
| Used in core | 2 occurrences in stock: the Sign button on outgoing deliveries, before and after Done |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | Partial. Studio's Signature field adds the field widget; this Sign button variant is XML-only |
| Alternatives | binary, image, attach_document |
What the signature widget does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
string | string (attribute) | The button label, Sign in core. Required by the component's props. |
signature_field | string (attribute) | Name of the binary field on the model that receives the image. The field does not need to be present in the view; the widget writes it directly.(default: signature) |
full_name | string (attribute) | Field whose value seeds the signature name block: display_name for a many2one, the raw value otherwise. An empty value leaves the dialog's default name. |
highlight | boolean (attribute) | Renders the button as btn-primary instead of btn-secondary. Core highlights Sign once the delivery is done.(default: false) |
The write bypasses the form. Confirming the dialog runs orm.write on the target field and then reloads the record. Unsaved edits elsewhere on the form are untouched but the signature itself never passes through onchange logic, and on a record that does not exist yet there is nothing to write to, which is why core guards every usage with invisible="not id".
Working examples
Hardcoded dialog, dead defaultFont, direct write
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | Verified | Not released. Owl props migration; defaultFont declared but still not settable from XML; see below. |
| Odoo 19.0 | Verified | Verified against the shipped source. Reads relational names via display_name. |
| Odoo 18.0 | Verified | Same attributes; relational names still read as value[1] tuples internally. |
| Odoo 17.0 | Verified | Same attributes and flow. No XML changes needed. |
| Odoo 16.0 | Verified | Same widget in the older class-property style, alongside the then-jSignature stack. |
Upgrade note. View XML for this widget is stable from 16 through 19. Only JavaScript patches need attention: 18 and earlier read relational display names as value[1] tuples, while 19 reads display_name, a change that ripples through any patch touching full_name handling.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| The Sign button is missing | Core gates it with invisible="not id ..." and a security group; new records and non-members see nothing. Save the record first and check membership of the gating group, stock.group_stock_sign_delivery on deliveries. |
| Signature saved into the wrong place, or an error on confirm | signature_field defaults to a field literally named signature, which your model may not have. Set signature_field to the actual binary field name on the model. |
| The signer's name is empty in the dialog | full_name is unset, or points at a field whose value is empty on this record. Point full_name at a filled field; many2one fields contribute their display name. |
| Discarding the form did not remove the signature | The widget writes with a direct orm.write, outside the form's save and discard cycle. This is by design; deleting the signature means clearing the binary field explicitly. |
| Expected the type-or-upload signature modes | This widget hardcodes draw mode with no name input. Use the signature field widget on a binary field for the full three-mode pad. |
Signature widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
signature | A Sign button in the form header writing into a binary field | View widget; draw-only dialog and a direct database write outside the form's save cycle |
| binary | Storing an already produced signature image as a file | Plain file upload and download; no drawing dialog |
| image | Displaying the captured signature on the form | Renders the binary as an image; pair it with this widget to show what was signed |
| attach_document | Uploading supporting documents instead of capturing a signature | Uploads to ir.attachment and can call a processing method |
Frequently asked questions
What is the difference between widget="signature" on a field and the signature view widget?+
Which field receives the drawing?+
Why does core hide the button until the record is saved?+
Can the signer type their signature instead of drawing?+
How do I print the captured signature on a report?+
Can I set the signature font from XML?+
Need signatures captured at the right moment in your flow?
Proof of delivery, equipment handovers, inspection sign-offs: we place signature capture exactly where your process needs it, wire the image into reports, and keep the legal trail clean. It is the kind of focused Odoo customization we ship every month.
Get your signature flow built