如何用JS或Controller在Odoo 16表单视图中嵌入通用QWeb视图?
解决Odoo表单视图复用统一摘要组件的问题
Odoo的表单视图(form视图)属于架构视图范畴,本身不支持t-call这类QWeb模板调用语法,想要实现统一摘要信息的复用,可通过以下两种方式解决:
方法1:通过视图继承注入通用片段
适合静态或简单内容的复用:
- 先定义通用的XML片段视图:
<record id="ec_summary_board_snippet" model="ir.ui.view"> <field name="name">ec.summary.board.snippet</field> <field name="model">ir.ui.view</field> <field name="arch" type="xml"> <div class="p-3"> Hello World </div> </field> </record>
- 继承目标表单视图,用
xpath将片段注入到表单内:
<record id="ec_medical_first_consultation_form_view" model="ir.ui.view"> <field name="name">ec.first.consultation.form</field> <field name="model">ec.first.consultation</field> <field name="inherit_id" ref="base.view_form"/> <field name="arch" type="xml"> <xpath expr="//form" position="inside"> <field name="ec_summary_board_snippet" widget="html"/> </xpath> </field> </record>
需要给多个表单添加时,重复继承对应表单视图,用相同的xpath逻辑注入即可。
方法2:自定义Widget实现动态复用
适合需要绑定数据或交互逻辑的场景:
- 编写Widget的JS逻辑:
odoo.define('ec_summary_board.widget', function (require) { 'use strict'; var core = require('web.core'); var Widget = require('web.Widget'); var EcSummaryBoard = Widget.extend({ template: 'EcSummaryBoardCustom', init: function (parent, record) { this._super(parent); this.record = record; }, // 可在此添加数据处理、事件绑定等逻辑 }); core.form_widget_registry.add('ec_summary_board', EcSummaryBoard); return EcSummaryBoard; });
- 编写对应的QWeb模板:
<template id="EcSummaryBoardCustom" xml:space="preserve"> <div class="p-3"> Hello World - <t t-esc="record.data.name"/> </div> </template>
- 在表单视图中直接使用该Widget:
<record id="ec_medical_first_consultation_form_view" model="ir.ui.view"> <field name="name">ec.first.consultation.form</field> <field name="model">ec.first.consultation</field> <field name="arch" type="xml"> <form string="First Consultation"> <widget name="ec_summary_board"/> <!-- 其他表单字段内容 --> </form> </field> </record>
关键提示
表单视图的arch结构仅支持Odoo官方定义的表单标签(如form、sheet、group、field等),无法直接使用QWeb的t-call语法,需通过上述视图继承或自定义Widget的方式实现组件复用。
内容的提问来源于stack exchange,提问作者Tangent Technologies
相关产品推荐
相关产品推荐

