The records of everything on a website are called website records. Everything that is produced or checked out on the website's front end will be kept on the back end. We can see that all the details of the website are stored on the backend. We can examine how to construct a form for a website and how to save that data in the backend.
Create a model and its view
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Tree View-->
<record id="survey_form_view_tree" model="ir.ui.view">
<field name="name">survey.form.view.tree</field>
<field name="model">survey.form</field>
<field name="arch" type="xml">
<tree create="false">
<field name="name"/>
<field name="dob"/>
<field name="qualification"/>
<field name="phone"/>
<field name="email"/>
</tree>
</field>
</record>
<!-- Record Action-->
<record id="survey_form_action" model="ir.actions.act_window">
<field name="name">Survey</field>
<field name="res_model">survey.form</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>
Then construct a menu called Survey.
<record id="website_survey_menu" model="website.menu">
<field name="name">Survey</field>
<field name="url">/survey</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">90</field>
</record>
By clicking on the menu we want to redirect to the form view. So we need to define a route function and the template.
from odoo import http
class Survey(http.Controller):
@http.route('/survey', auth='public', website=True)
def survey(self):
return request.render(module_name.survey_form_template')
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="survey_form_template" name="Survey Form">
<t t-call="website.layout">
<div class="container s_website_form">
<h3>Survey Form</h3>
<t t-if="submitted">
<h3 class="alert alert-success mt16 mb16">
<i class="fa fa-thumbs-up"/>
Survey submitted successfully
</h3>
<a href="/survey_form">Submit another survey</a>
</t>
<t t-else="">
<div class="row">
<div class="col-6">
<form id="form_survey_form"
action="/survey_form" method="POST">
<input type="hidden" name="csrf_token"
t-att-value="request.csrf_token()"/>
<div class="s_website_form_rows row s_col_no_bgcolor">
<div class="form-group col-12">
<label for="name">Name</label>
<input type="text" class="form-control"
name="name"
placeholder="Enter your name"
required="required"/>
</div>
<div class="form-group col-12">
<label for="email">Email</label>
<input type="email" class="form-control"
name="email"
placeholder="Enter your mail-id"
required="required"/>
</div>
<div class="form-group col-12">
<label for="phone">Phone</label>
<input type="number"
class="form-control"
name="phone"
placeholder="Enter your name"
required="required"/>
</div>
<div class="form-group col-12">
<label for="dob">DOB</label>
<input type="date" class="form-control"
name="dob"
placeholder="dd/mm/yyyy"/>
</div>
<div class="form-group col-12">
<label for="qualification">
Qualification
</label>
<select class="form-control"
name="qualification">
<option value="">Select</option>
<option value="pg">Post Graduation
</option>
<option value="ug">Graduation
</option>
<option value="higher_secondary">
Higher Secondary
</option>
<option value="secondary">
Secondary
</option>
</select>
</div>
<div class="form-group col-12">
<input type="submit"
class="btn btn-primary"
value="Submit"/>
</div>
</div>
</form>
</div>
</div>
</t>
</div>
</t>
</template>
</odoo>
Next, we need to define another route function that creates a record in the backend when we submit the form.
@http.route(['/survey_form'], type='http', auth="user", website=True)
def survey_form(self, **post):
name = post.get('name')
email = post.get('email')
phone = post.get('phone')
if name and email and phone:
request.env['survey.form'].sudo().create({
'name': name,
'email': email,
'phone': phone,
'dob': post.get('dob'),
'qualification': post.get('qualification')
})
return request.redirect('/survey_form?submitted=1')
return request.render(module_name.survey_form_template',
{'submitted': post.get('submitted', False)})
When the survey_form triggers a new record will be created in the backend with input values in the frontend.