Odoo 16 Development Book

Web Development

Controllers

In Odoo, web controllers are a class that can be used to connect the front end with the backend models. If we need to render some data from the backend model to the website, we can use the Controllers in such scenarios

For creating a web controller, initially, we need to create a directory called “Controllers” with __init__.py and a python file inside our custom module.

For Instance, let’s create a controller that fetches data from res. partner model and pass to a web page.

from odoo import http, _
from odoo.http import request
class ResPartnerController(http.Controller):
	@http.route('/contacts', type='http', auth='public', website=True)
	def contact_details(self, **kwargs):
    	partner_data = request.env['res.partner'].sudo().search([])
    	values = {
        	'partners': partner_data,
    	}
    	return request.render("library_management.contact_details_template", values)

The Controllers in Odoo are actually inherited from the “Controller” class, as you can see from the above code. The ‘ ‘@http.route()’ defined in the controller specifies some details like the url of the page that need to be redirected, the type of the request (can be http or json), auth for specifying who can access the url, website parameter for specifying the controller is linked with a page (it will take either True or False values).

Lastly, in the controller function definition, using request.render(), we can specify the template that needs to be rendered when redirecting to the specified URL.

Then, we can create the XML file for creating the template specified in the controller.

<odoo>
	<record id="contact_menu" model="website.menu">
    	<field name="name">Contacts</field> <!-- Name of the menu-->
    	<field name="url">/contacts</field>
    	<field name="parent_id" ref="website.main_menu"/>
	</record>
	<template id="contact_details_template" name="Contact Details">
    	<t t-call="website.layout">
        	<div class="oe_structure">
            	<div class="container">
                	<br/>
                	<center>
                    	<h3>Contact Details</h3>
                	</center>
                	<br/>
                	<table class="table-striped table">
                    	<thead style="font-size: 23px;">
                        	<tr>
                            	<h6>
                                	<b>
                                    	<th>Name</th>
                                    	<th>Mobile</th>
                                    	<th>Email</th>
                                    	<th>Job Position</th>
                                	</b>
                            	</h6>
                        	</tr>
                    	</thead>
                    	<tbody>
                        	<t t-foreach="partners" t-as="partner">
                            	<tr>
                                	<td>
                                    	<span t-esc="partner.name"/>
                                	</td>
                                	<td>
                                    	<span t-esc="partner.mobile"/>
                                	</td>
                                	<td>
                                    	<span t-esc="partner.email"/>
                                	</td>
                                	<td>
                                    	<span t-esc="partner.function"/>
                                	</td>
                            	</tr>
                        	</t>
                    	</tbody>
                	</table>
            	</div>
        	</div>
    	</t>
	</template>
</odoo>

This is how we can create a new controller in Odoo 16.

In Odoo, it's also possible to inherit an already existing controller. For Instance, if we need to override the controller “CustomerPortal” defined by the “portal” module,

First need to import the controller class like below,

from odoo.addons.portal.controllers.portal import CustomerPortal

Here the “portal” is the controller file where the “CustomerPortal” Controller class is defined. After importing the controller, we can override the function like below,

class CustomerPortalPasswordPolicy(CustomerPortal):
	def _prepare_portal_layout_values(self):
    	d = super()._prepare_portal_layout_values()
    	d['password_minimum_length'] = request.env['ir.config_parameter'].sudo().get_param('auth_password_policy.minlength')
    	return d

This is how we can create and override a controller in Odoo 16

location

Calicut

Cybrosys Technologies Pvt. Ltd.
Neospace, Kinfra Techno Park
Kakkancherry, Calicut
Kerala, India - 673635

location

Kochi

Cybrosys Technologies Pvt. Ltd.
1st Floor, Thapasya Building,
Infopark, Kakkanad,
Kochi, India - 682030.

location

Bangalore

Cybrosys Techno Solutions
The Estate, 8th Floor,
Dickenson Road,
Bangalore, India - 560042

Send Us A Message