Thanks to KenlyΒ΄s feedback i could solve it.
This ensures your JS only runs on your intended view and doesn't affect global performance or other modules.
π Recommended module structure:
your_module/
βββ static/
β βββ src/
β βββ js/
β βββ custom_renderer.js
β βββ custom_view.js
βββ views/
β βββ custom_form_view.xml
βββ __manifest__.py
π§ 1. custom_renderer.js
odoo.define('your_module.CustomRenderer', function(require) {
'use strict';
const FormRenderer = require('web.FormRenderer');
const CustomRenderer = FormRenderer.extend({
_renderView: function() {
this._super.apply(this, arguments);
try {
console.log('π§ CustomRenderer active only on this view');
// Your custom logic here
const input = this.el.querySelector('input[name="your_field_name"]');
if (input) {
input.focus();
}
} catch (err) {
console.warn('β οΈ Error in CustomRenderer:', err);
}
}
});
return CustomRenderer;
});
π§© 2. custom_view.js
odoo.define('your_module.CustomFormView', function(require) {
'use strict';
const FormView = require('web.FormView');
const viewRegistry = require('web.view_registry');
const CustomRenderer = require('your_module.CustomRenderer');
const CustomFormView = FormView.extend({
config: _.extend({}, FormView.prototype.config, {
Renderer: CustomRenderer,
}),
});
viewRegistry.add('custom_form_view', CustomFormView);
return CustomFormView;
});
π§Ύ 3. manifest.py
'assets': {
'web.assets_backend': [
'your_module/static/src/js/custom_renderer.js',
'your_module/static/src/js/custom_view.js',
],
},
π§± 4. In your view XML (custom_form_view.xml):
<odoo>
<record id="your_model_form_view" model="ir.ui.view">
<field name="name">your.model.form</field>
<field name="model">your.model</field>
<field name="arch" type="xml">
<form string="My Special View" js_class="custom_form_view">
<sheet>
<group>
<field name="your_field_name"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>
π Important: js_class="custom_form_view" must match the name used in viewRegistry.add().
β Benefits: Modular and clean code.
No interference with other views like Settings or Purchases.
Scalable pattern for adding custom JS to specific form views.