No-Code Custom Fields for Any Odoo Model
Extend Odoo Without Writing a Single Line of Python
Siso Smart Fields is a bespoke no-code tool designed to bring advanced database customization to Odoo Community Edition, while functioning as a robust, parallel enhancement for Enterprise users. It lets administrators create custom database columns on any Odoo model directly from a simple Settings interface—with no Python code and no server restarts required.
While the primary goal of Siso Smart Fields is to provide Community users with a capability typically reserved for Enterprise Studio, it is built with an architecture that respects and enhances both environments:
x_siso_ prefix for all technical names, keeping them distinct from Studio's x_studio_ fields while remaining equally usable across the system.Fields created with Siso Smart Fields are real database columns. They are immediately available to Odoo's built-in filter and group-by tools, to server actions and automations, to reports, and to any custom scripts or integrations that query the database. There is no intermediate layer—the data is stored natively in the same PostgreSQL tables used by Odoo's own fields.
Beyond storage, Smart Fields can optionally inject the field directly onto the model's default form view. The placement is configurable: choose the notebook tab, the named section within that tab, and—where the section has a two-column layout—the left or right column.
What users can do with custom fields once they have been created and placed on a form.
Custom fields created with Smart Fields appear on form views just like any native Odoo field. There is no visual distinction that marks a field as custom — it has a label, an input control, and optionally a ? tooltip icon if the administrator has added a help text.
Custom fields are fully integrated with Odoo's standard interface:
x_siso_).Every custom field's full database column name is shown in the field definition form as Full Field Name. The format is always x_siso_<name>, for example x_siso_visma_id.
Smart Fields supports ten field types. Each type stores data natively in the Odoo database and renders with the appropriate widget on form views.
| Type | Storage | Widget | Best for |
|---|---|---|---|
| Text / VARCHAR | varchar(n) | Single-line input | Short identifiers, codes, names |
| Text / Multiline | text | Textarea | Notes, descriptions, instructions |
| Integer | int4 | Number input | Counts, quantities, IDs |
| Float / Decimal | float8 | Number input | Measurements, scores, prices |
| Boolean | bool | Toggle | Yes/No flags, switches |
| Date | date | Date picker | Deadlines, dates of birth, expiry |
| Date & Time | timestamp | Datetime picker | Events, timestamps |
| Selection / Dropdown | varchar | Select menu | Status, classification, category |
| Tags / Multi-select | many2many | Tag chips | Keywords, attributes, labels |
| Files / Attachment list | many2many | File list | Documents, drawings, PDFs |
Once a field has been created and the database column provisioned, the Field Type, Field Name, and Target Model cannot be changed. To change the type, delete the field and create a new one. Deletion is a permanent operation — see Chapter 9.
Both the Selection / Dropdown and Tags / Multi-select types require a list of options. Options are defined in the Options text area in the field definition.
Enter one option per line. The simplest form is a plain label — Smart Fields will use it as both the stored value and the display label:
Metric
Imperial
Other
If you need separate stored values and display labels (useful for integrations that rely on specific codes), use value,Label format:
metric,Metric System
imperial,Imperial System
other,Not specified
You can also paste a JSON array directly:
[["metric", "Metric System"], ["imperial", "Imperial System"]]
The Tags type creates a native many2many field. Options are pre-populated from the Options text but can also be created directly on any record by typing a new value into the tag input — no need to return to the field definition.
Edit the Options text in the field definition and save. For dropdowns, the new options list is pushed to the database column immediately. For tags, new entries are added to the options pool — existing selections on records are not affected.
The Files / Attachment list type adds a file management section directly to any form. Files are stored in Odoo's private attachment model, separate from the chatter attachments on the same record.
Each row in the list displays:
Click any row in the file list to open the dialog again. You can change the label or replace the file without deleting and re-uploading.
By default, the list shows up to 4 rows before displaying a Load more link. Administrators can change this limit per field using the Max visible rows setting in the field definition — see Chapter 6.
Creating, configuring, placing, and removing custom fields.
Siso Smart Fields requires Siso Smart Hub to be installed first. Smart Hub provides the Siso Smart Suite section in the Settings menu where Smart Fields appears.
After activation, Custom Fields appears under Settings → Technical → Siso Smart Suite.
On Odoo.sh, push the siso_smart_fields module directory to your custom addons branch. Both siso_smart_hub and siso_smart_fields must be present. Odoo.sh will install them automatically if they appear in the Apps list.
Navigate to Settings → Technical → Siso Smart Suite → Custom Fields and click New.
x_siso_<field_name>. Cannot be changed after creation.Additional fields appear depending on the selected type:
total_digits,decimal_places, e.g. 16,2.Saving the field definition immediately creates the database column. The field is available to filters, automations, and scripts the moment the record is saved — no restart needed.
An optional Tooltip text field appears in the Display section when Show on Form is enabled. Enter any text here and a ? icon will appear next to the field label on the form, showing the tooltip text on hover — identical to how Odoo documents its own built-in fields.
Enable Show on Form to inject the field into the model's default form view. Three placement controls appear once enabled:
Select the notebook tab where the field should appear. The dropdown lists all named tabs from the model's form view. The first option, Automatic (above tabs), places the field in a "Custom Fields" group above the notebook — useful for models with few or no tabs.
Once a specific tab is selected, a second dropdown lists all named sections (groups with visible headers) within that tab. Leaving this blank places the field at the tab level. Selecting a section places the field at the bottom of that section's content.
Appears only when the selected section has a two-column internal layout. Choose Left or Right to target a specific column. When a column is selected, the field blends in organically with surrounding fields — the "Custom Fields" section header is omitted.
If a tab or section you expect is not in the dropdown, click Refresh tab list. This re-reads the current form view and updates the available options — useful after installing a new module that modifies the target form.
Each field has independent placement settings. You can place different fields in different tabs and sections on the same model. All fields for the same model share a single injected view record — changing any field's placement regenerates the shared view automatically.
Open any field definition from Settings → Custom Fields to make changes. The following properties can be updated after creation:
The following properties are locked after the field is first saved: Target Model, Field Name, and Field Type. These define the physical database column structure and cannot be changed without deleting and recreating the field.
Open the field definition and click the red Delete Field & Data button at the top of the form. A confirmation dialog appears before any data is removed.
ir.model.fields database record and the underlying column are dropped from the model's table.
Deleting a field removes all stored data for that field across every record in the system. This cannot be undone. Always back up your database before deleting fields that contain important data.
If the field is referenced in saved filters, server actions, or automation rules, those references will break after deletion. Odoo does not automatically clean up references to deleted fields in these objects — review and remove them manually beforehand.
An orphaned field is an x_siso_-prefixed column that exists in the database but has no corresponding Smart Fields definition record. This can occur after a database migration, a manual SQL operation, or if the definition record was deleted directly from the database.
To bring orphaned fields back under management, open the Custom Fields list view and click the Adopt Orphaned Fields action button in the action menu. Smart Fields will scan for all x_siso_ columns without a definition and create one for each, restoring management control.
Adopted fields are created with minimal metadata — label derived from the field name, type inferred from the column type. Review each adopted field and update the label, add placement settings, and configure any type-specific options that apply.
Summary of all available field types and their key properties.
| Type | DB Column | Configurable Parameters | Locked after save? |
|---|---|---|---|
| Text / VARCHAR | varchar(n) | Max Length (default 255) | Type, Field Name, Model |
| Text / Multiline | text | — | Type, Field Name, Model |
| Integer | int4 | — | Type, Field Name, Model |
| Float / Decimal | float8 | Precision (e.g. 16,2) | Type, Field Name, Model |
| Boolean | bool | — | Type, Field Name, Model |
| Date | date | — | Type, Field Name, Model |
| Date & Time | timestamp | — | Type, Field Name, Model |
| Selection / Dropdown | varchar | Options list | Type, Field Name, Model |
| Tags / Multi-select | many2many table | Options list (pre-populated) | Type, Field Name, Model |
| Files / Attachment list | many2many table | Max visible rows (default 4) | Type, Field Name, Model |
How to format the Options field for Selection and Tags field types.
The Options text area accepts three formats, which can be mixed within the same field:
One label per line. The label is used as both the stored value and the display value.
Metric
Steel
Insulated grip
Premium
One pair per line in value,Display Label format. The value is what gets stored in the database; the label is what the user sees. Use this when integrations depend on specific stored codes.
metric,Metric System
imperial,Imperial System
not_specified,Not specified
Paste a JSON array of [value, label] pairs directly. Useful when copying option lists from another system.
[["metric", "Metric System"], ["imperial", "Imperial System"], ["other", "Other"]]
Empty lines in the Options text are silently skipped. Lines without a comma are treated as plain labels (value = label).
Edit the Options text and save the field definition. For Selection fields, the full options list is replaced. For Tags fields, new entries are added to the tag pool — entries removed from the Options text remain in the database (and on existing records) but will no longer appear as suggestions in the tag input.
If you rename a stored value in a Selection field's options (e.g. change metric to metric_si), any records that already have metric stored will display a blank or invalid value. Always migrate data before renaming stored values.