当前位置: 首页 > wzjs >正文

wordpress建站不好用网站专门做冻品的

wordpress建站不好用,网站专门做冻品的,适合交换友情链接的是,瑞安 网站建设Odoo QWeb 模板引擎详解与实战 Odoo 的 QWeb 是其自研的模板引擎,广泛应用于 HTML、XML、PDF 等内容的生成,支撑了前端页面渲染、报表输出、门户页面、邮件模板等多种场景。本文将系统介绍 QWeb 的核心用法、工作原理,并通过实战案例演示如何…

Odoo QWeb 模板引擎详解与实战

Odoo 的 QWeb 是其自研的模板引擎,广泛应用于 HTML、XML、PDF 等内容的生成,支撑了前端页面渲染、报表输出、门户页面、邮件模板等多种场景。本文将系统介绍 QWeb 的核心用法、工作原理,并通过实战案例演示如何在门户页面实现表单提交与数据存储。


一、QWeb 简介

QWeb 是 Odoo 原生的 XML/HTML 模板引擎,采用 XML 语法,通过丰富的 t- 前缀指令(如 t-foreacht-ift-call 等)实现模板逻辑控制。与 Jinja2 相比,QWeb 更加结构化、安全,适合可视化编辑器和网页构建器场景。

QWeb 支持两大类渲染方式:

  • 前端渲染:用于 Web 页面(如门户、报表、邮件预览等)
  • 后端渲染:用于生成 PDF 报表、邮件内容等(通过 Python 代码调用)

二、QWeb 核心指令(t-指令)

指令用法示例
t-foreach遍历<t t-foreach="docs" t-as="doc">...</t>
t-if / t-elif / t-else条件判断<t t-if="doc.state == 'done'">完成</t>
t-set设置变量<t t-set="total" t-value="sum(docs.mapped('amount'))"/>
t-call引用模板<t t-call="module_name.template_name"/>
t-field渲染字段<span t-field="doc.partner_id"/>
t-esc转义输出<span t-esc="doc.name"/>
t-raw原样输出(不转义)<div t-raw="doc.html_description"/>

三、QWeb 应用场景

1. Web 前端视图(门户、自定义页面等)

QWeb 模板常用于 ir.ui.view(type=‘qweb’)视图,广泛应用于门户表单、公共页面等。例如:

<template id="my_portal_form" name="My Portal Form"><form action="/my/form/submit" method="post"><input type="text" name="name"/><t t-if="user_id"><input type="hidden" name="user_id" t-att-value="user_id"/></t></form>
</template>

通过控制器渲染模板:

return request.render('my_module.my_portal_form', {'user_id': user.id})

2. 报表生成(PDF 报表)

Odoo 利用 QWeb 生成 PDF 报表(如发票、订单等),通过 report_qweb 模块实现。

模板定义:

<template id="report_order_document"><t t-call="web.external_layout"><t t-set="doc" t-value="docs[0]"/><div class="page"><h2>订单号:<span t-field="doc.name"/></h2></div></t>
</template>

渲染调用:

return self.env.ref('sale.report_saleorder').report_action(self)

3. 控制器网页(如公开网站或门户)

结合 Web Controller 使用:

@http.route('/public/page', type='http', auth='public', website=True)
def public_page(self, **kwargs):return request.render('my_module.public_template', {'data': some_data})

四、QWeb 工作原理

1. 模板加载

QWeb 模板存储于 ir.ui.view 表(type=‘qweb’),Odoo 启动时会将其缓存至内存,供后续渲染调用。

2. 渲染引擎

QWeb 的核心为 QWebEngine(Python 实现):

  • 解析模板为 DOM 树结构
  • 根据上下文渲染 t-指令
  • 输出最终 HTML 字符串

常见调用方式:

  • Web 控制器:request.render(template_name, context)
  • 后端报表:self.env.ref('module.report_template_id').render(context)

3. 继承机制(t-inherit)

QWeb 支持模板继承,类似 XML 视图继承:

<template id="my_template_inherit" inherit_id="base.template_to_inherit"><xpath expr="//div[@id='target']" position="replace"><div>新的内容</div></xpath>
</template>

五、开发与调试建议

  • 开启开发者模式,便于查看 QWeb 模板结构
  • 使用 <t t-debug="1"> 触发前端调试工具
  • 报表调试可用 --log-level=debug 输出渲染上下文
  • t-field 可自动格式化输出复杂字段(如货币、日期)

六、实战案例:门户表单 + 控制器

1. 业务场景

实现门户页面 /project/apply,展示项目申请表,用户提交后由控制器处理并保存至数据库。

2. 数据模型

# models/project_application.py
from odoo import models, fieldsclass ProjectApplication(models.Model):_name = 'project.application'_description = 'Project Application'name = fields.Char(string='Applicant Name', required=True)email = fields.Char(string='Email')project_name = fields.Char(string='Project Name')description = fields.Text(string='Project Description')

3. QWeb 表单模板

<!-- views/project_application_templates.xml -->
<odoo><template id="project_application_form" name="Project Application Form"><t t-call="website.layout"><div class="container mt-5"><h2>项目申请表</h2><form action="/project/apply/submit" method="post" class="form-group"><input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/><div class="form-group"><label>姓名</label><input type="text" name="name" class="form-control" required/></div><div class="form-group"><label>Email</label><input type="email" name="email" class="form-control"/></div><div class="form-group"><label>项目名称</label><input type="text" name="project_name" class="form-control"/></div><div class="form-group"><label>项目描述</label><textarea name="description" class="form-control"></textarea></div><button type="submit" class="btn btn-primary mt-2">提交申请</button></form></div></t></template><template id="project_application_success" name="Application Success"><t t-call="website.layout"><div class="container mt-5"><h2>提交成功!</h2><p>感谢您的申请,我们会尽快处理。</p></div></t></template>
</odoo>

4. 控制器逻辑

# controllers/main.py
from odoo import http
from odoo.http import requestclass ProjectApplicationController(http.Controller):@http.route('/project/apply', type='http', auth='public', website=True)def apply_form(self, **kwargs):return request.render('your_module_name.project_application_form')@http.route('/project/apply/submit', type='http', auth='public', website=True, csrf=True)def apply_form_submit(self, **post):request.env['project.application'].sudo().create({'name': post.get('name'),'email': post.get('email'),'project_name': post.get('project_name'),'description': post.get('description'),})return request.render('your_module_name.project_application_success')

5. Manifest 配置

# __manifest__.py
'data': ['views/project_application_templates.xml',
],

6. 访问测试

启动 Odoo 后,访问 http://localhost:8069/project/apply,填写并提交表单,系统将保存数据并显示成功页面。


七、进阶建议

功能实现方式
表单校验HTML5 校验 + 控制器后端校验
自动填充用户信息控制器中通过 request.env.user 获取当前用户信息
文件上传表单添加 enctype="multipart/form-data",后端用 request.httprequest.files 处理
提交后跳转页面使用 return request.redirect('/thank-you')

八、总结

项目描述
渲染引擎QWebEngine(Python 层)
应用场景Web 页面、报表模板、控制器页面、门户表单
优点安全、结构化、可嵌套、支持继承
与 Jinja2 比较更偏向 XML 结构控制,适合 B2B 页面、门户、报表;Jinja 更灵活



文章转载自:

http://27H4FEWi.Lwswm.cn
http://ePASEPRK.Lwswm.cn
http://U0S7XqyX.Lwswm.cn
http://uUl188dm.Lwswm.cn
http://asLeyNiB.Lwswm.cn
http://4ikrTRlF.Lwswm.cn
http://YGSLzQWr.Lwswm.cn
http://9jyqiHDw.Lwswm.cn
http://jzqGxfrO.Lwswm.cn
http://yIlR2go4.Lwswm.cn
http://eSjYxSsQ.Lwswm.cn
http://GRQShCEG.Lwswm.cn
http://jwmZI2Hg.Lwswm.cn
http://53LsFk1l.Lwswm.cn
http://JkSViAqN.Lwswm.cn
http://CJfb3Lk8.Lwswm.cn
http://NMStQsH5.Lwswm.cn
http://0nvkMU28.Lwswm.cn
http://8MV1UD3U.Lwswm.cn
http://cSoaiL92.Lwswm.cn
http://yuWA6rZw.Lwswm.cn
http://iwFpgtQw.Lwswm.cn
http://nMH12vqu.Lwswm.cn
http://77YgdRfF.Lwswm.cn
http://ZG84zf3x.Lwswm.cn
http://rLDXje9V.Lwswm.cn
http://a3rfY1hb.Lwswm.cn
http://Z8w7WEN5.Lwswm.cn
http://tTMJcobz.Lwswm.cn
http://AD18aoHW.Lwswm.cn
http://www.dtcms.com/wzjs/775624.html

相关文章:

  • 双语言网站模版logo设计免费在线制作
  • 哈尔滨论坛建站模板百度云服务器一年多少钱
  • 做网站电脑开一天用多少钱做网站的公司北京有哪些
  • 合肥 网站制作高端交易所开发
  • 屏山移动网站建设互联网公司排名500强
  • 皮革城网站建设方案网站推广到海外怎么做
  • 网站建设 字体版权ps怎么做网站logo
  • html网站简易模板当地人做导游的旅游网站
  • 黔东南网站设计公司适合初学者模仿的网站
  • 小说网站开发的目的交互设计作品集
  • 宁波网络建站公司有哪些微网站开发 付费阅读
  • wordpress怎么添加企业网站深圳住房建设局网站申报
  • 建立一个公司网站大约多少钱上海外包软件开发
  • 一个做网站的软件wordpress 开发飞猪接口
  • 建设投票网站的目的58同城网站建设方案
  • 软件开发包含网站开发吗做网站要学什么软件
  • 棠下手机网站建设电话建设国际互联网网站
  • html 网站新功能介绍怎么在网站后台加框框
  • 织梦怎么做中英文网站青岛即墨网站开发
  • 苏州网站开发的企业新闻报道最近
  • 网站设计与制作培训学校强企网做网站
  • 一些做的好的网站一个公司能备案几个网站
  • 网站基本功能如何建设自己的小说网站
  • 集群网站开发网站工程师证书
  • 湖南网站开发公司姜堰网站定制
  • 网站建设html手套网站模板
  • 汽车网站名称网站建设怎么问问题
  • 怎么做定位钓鱼网站金坛网页设计
  • 信阳网站建设制作视频的软件哪个最好免费的
  • 网站开发需求清单做网站有底薪吗