网站表单允许您收集用户信息。您可以使用这些输入数据在后台创建新记录。这些数据还可用于执行任何计算,或从中获取任何类型的信息。因此,表单在用户交互中发挥着不可或缺的作用,从而提高了用户体验和满意度。使用代码可以从前端和后端创建网站。
在本文中,我们将讨论如何借助自定义模块,通过代码创建网站表单。
假设现在需要允许用户通过网站创建预约。为此,我们在网站上创建一个 "预约 "菜单。下面的 XML 代码将创建一个名为 "预约 "的新菜单,因为它使用了网站。作为父菜单的 main_menu 应根据该自定义模块添加一个网站模块。
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="menu_appointment" model="website.menu">
<field name="name">Appointment</field>
<field name="url">/appointment</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence">55</field>
</record>
</data>
</odoo>
name:指定新建菜单的名称
URL:点击菜单时重定向 URL路径
parent_id:指定创建菜单的父菜单
sequence:菜单的序列。用于确定菜单的位置
通过菜单 URL 可以调用相应的控制器。在该控制器方法中,可以向表单模板传递数据。在这种情况下,网站用户可以在网站页面选择对象来创建预约。
from odoo import http
From odoo.http import request
class WebsiteForm(http.Controller):
@http.route(['/appointment'], type='http', auth="user", website=True)
def appointment(self):
partners = request.env['res.partner'].sudo().search([])
values = {}
values.update({
'partners': partners
})
return request.render("website_form.online_appointment_form", values)
下一步是使用控制器方法中指定的 ID 创建模板。该模板将显示一个简单的表单,其中包含预约所需的所有输入字段。
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="online_appointment_form">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_website_form" data-vcss="001" data-snippet="s_website_form">
<div class="container">
<form action="/appointment/submit/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*" data-model_name="" data-success-page="">
<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 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="studio1">
<span class="s_website_form_label_content">Name</span>
<span class="s_website_form_mark"> *</span>
</label>
<div class="col-sm">
<input id="name" type="text" class="form-control s_website_form_input" name="name" required="1"/>
</div>
</div>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="studio1">
<span class="s_website_form_label_content">Phone</span>
<span class="s_website_form_mark"> *</span>
</label>
<div class="col-sm">
<input id="phone" type="text" class="form-control s_website_form_input" name="phone" required="1"/>
</div>
</div>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="studio1">
<span class="s_website_form_label_content">Email</span>
<span class="s_website_form_mark"> *</span>
</label>
<div class="col-sm">
<input id="email" type="email" class="form-control s_website_form_input" name="email" required="1"/>
</div>
</div>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="studio1">
<span class="s_website_form_label_content">Partner</span>
<span class="s_website_form_mark"> *</span>
</label>
<div class="col-sm">
<select name="partner_id" t-attf-class="form-control s_website_form_input" required="1">
<t t-foreach="partners or []" t-as="partner">
<option t-att-value="https://partner.id%22%3E/
<t t-esc="partner.name" />
</option>
</t>
</select>
</div>
</div>
</div>
<div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="studio1">
<span class="s_website_form_label_content">Date</span>
<span class="s_website_form_mark"> *</span>
</label>
<div class="col-sm">
<input id="appointment_date" type="date" class="form-control s_website_form_input" name="appointment_date" required="1"/>
</div>
</div>
</div>
<div class="form-group col-12 s_website_form_submit" data-name="Submit Button">
<div style="width: 200px;" class="s_website_form_label"/>
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</section>
</div>
</t>
</template>
</odoo>
网站表单将收取用户的输入信息,并将其传递给表单模板定义中指定的控制器。然后,应用这些信息可以在预约模型中创建新记录。