Skip to main content
iVentureTeam

applicant_char

A 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.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 8, 20265 min read
Technical nameapplicant_char
Field typeschar, text
Viewslist, form
Modulehr_recruitment, the Recruitment app
Used in core1 occurrence, the attachments list in hr_recruitment
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. It reads the attachment's model and record fields by name
Alternativesmany2one, reference, char, applicant_line_many2many

What the applicant name cell does

Attachments in Odoo are stored generically: each one records which model and which record it belongs to, plus that record's name for display. That generality is why the attachments list can show CVs, invoices and photos side by side, and it is also why the name in that list is plain text rather than a link.

On a recruitment attachments list, that plain text is frustrating. The name is an applicant, the reader wants to open the applicant, and the field is not a relation so the usual link does not exist.

This widget adds it. It renders the value as an ordinary text cell that responds to a click by opening the applicant, using the model and record identifiers the attachment already carries.

What this means for your team

Recruitment is a high-volume, attachment-heavy process, and the attachment list is where people go looking when a CV needs finding. Turning names into links removes a search step from an action people take repeatedly.

The generalizable point is that a link does not require a relation. Where a model already stores a model name and a record id, as attachments and activities do, a small widget can navigate without changing the schema. That is often cheaper than adding a relation that only exists to be clickable.

Supported options in Odoo 19

The widget declares no options of its own. It spreads the text field's descriptor, so the options below are inherited and work normally. The click behavior is driven by two fields on the record, described in the note. Read from applicant_char.js and the char field, Odoo 19.0.

OptionTypeWhat it does
res_modelfield read by literal nameCompared against the applicant model. If it differs, the click does nothing at all.
res_idfield read by literal nameThe record opened by the click. Its absence also disables the click.
placeholder_fieldfieldInherited from the text field. Shows another field's value as a hint when this one is empty.

Two fields are read by literal name. The linked record and the model it belongs to. Both must be present on the record, and the model must match the applicant model, otherwise the click does nothing at all. That double guard is what keeps the widget harmless on non-recruitment attachments.

Working examples

The core usage

<field name="res_name" widget="applicant_char"
       string="Applicant"
       invisible="res_model != 'hr.applicant'"/>

The view hides the column for other models, which pairs with the widget's own guard rather than replacing it.

The fields it reads

res_model  # must be the applicant model
res_id     # the record to open

Both read by literal name from the attachment.

The plain text field

<field name="res_name"/>

Same value, no link, which is what other attachment lists show.

Navigating without a relation

The widget is twenty lines. It extends the text field, takes the action service, and adds a click handler.

That handler checks two things before doing anything: that the attachment has a linked record, and that its model is the applicant model, compared as a literal string. Only then does it build a window action for that record and open it as a form in the current window.

Opening in the current window rather than a dialog is deliberate, and it is what preserves the breadcrumb so the user can walk back to the attachment list. It also means the action is constructed by the widget rather than fetched from the server, so a customized applicant form is still used but any window action configuration is not.

The double guard is worth appreciating for what it prevents. Attachments are shared across every model, and a widget that navigated on any attachment would open arbitrary records from a generic list. Comparing the model explicitly keeps it inert everywhere else, which is why it is safe for the column to exist at all.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Byte-identical to Odoo 19 on the development branch.
Odoo 19.0VerifiedVerified against the shipped source.
Odoo 18.0VerifiedSame behavior.
Odoo 17.0VerifiedSame behavior with older component conventions.
Odoo 16.0VerifiedSame behavior with older component conventions.

Upgrade note. Nothing to do. The widget has been present since Odoo 16 with the same behavior; the only differences across versions are component conventions rather than behavior.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and this may still change; we re-verify the page after release.

Byte-identical. The file on the development branch matches Odoo 19 exactly, including the literal model comparison and the constructed window action.

Common problems and fixes

SymptomCause and fix
Clicking does nothingThe attachment has no linked record, or its model is not the applicant model. Expected on other kinds of attachment; the guard is deliberate.
The column shows for non-recruitment attachmentsThe view's own visibility expression was removed. Restore the invisible expression; the widget stays inert but the column is noise.
The applicant opens in a dialogA customization changed the action target. The widget builds a current-window action; check for an override.
A customized applicant form is not usedThe action is constructed rather than fetched, so it opens the default form view. Point the default form view at your customization, or patch the widget.
Options are ignoredOnly the inherited text options apply; the widget declares none. Use the text field's options as usual.
Missing widget errorThe recruitment module is not installed in that database. Install Recruitment, or use a plain text field.

Applicant name cell vs the alternatives

WidgetBest forKey difference
applicant_charMaking a stored record name clickable where the field is not a relationOpens the applicant from the attachment's own model and id, guarded on the model matching
many2oneFields that really are relationsA link for free, plus search and creation
referenceStoring a model and record pair genericallyChanges what is stored, but gives a picker as well as a link
charA plain name with no navigationWhat every other attachment list shows
applicant_line_many2manyApplicants shown as tagsA relation rendered as tags rather than a clickable name

Where the field is a real relation, the relation widget gives a link for free and is the right choice. This widget exists for the case where it is not, and the same idea applies to any model storing a model name and a record id. The reference widget covers that generically, at the cost of changing what is stored.

Frequently asked questions

Why is this needed when relations already link?+
Because the field is not a relation. Attachments store a model name, a record id and that record's name as text, so a normal link does not exist and the widget builds one.
Why does clicking sometimes do nothing?+
Two guards must pass: the attachment must have a linked record, and its model must be the applicant model, compared as a literal string. On any other attachment the cell is inert.
Does it open in a dialog?+
No. It opens a form in the current window, which keeps the breadcrumb so you can return to the attachment list.
Does it support the text field's options?+
Yes. It spreads that descriptor unchanged, so the inherited options behave normally.
Which versions have it?+
Odoo 16 onwards with the same behavior, and byte-identical on the Odoo 20 development branch.

Recruitment that does not lose the CV

Applications, attachments and the pipeline around them only work when finding a candidate takes seconds. We implement Odoo Recruitment, including sourcing integrations, on versions 16 through 19.

Book a free consultation

How this page was produced

The two guards, the literal model comparison and the constructed window action were read from applicant_char.js on the Odoo 19.0 branch, with the inherited option set read from the char field in web. The usage comes from hr_recruitment/views/ir_attachment_views.xml. Version coverage comes from comparing the file across the 16.0, 17.0 and 18.0 branches and a byte comparison against the public development branch. Spotted an error? Tell us and we will correct the page.