Reportes QWeb y Generación de PDF en Odoo
El motor de reportes de Odoo utiliza QWeb, un motor de plantillas XML/HTML que se compila a documentos PDF de alta calidad tipográfica mediante el motor de renderizado del servidor wkhtmltopdf.
1. Declaración de la Acción de Reporte (ir.actions.report) #
En Odoo moderno, los reportes se declaran como registros de ir.actions.report:
1<odoo> 2 <record id="action_report_library_book" model="ir.actions.report"> 3 <field name="name">Ficha de Libro</field> 4 <field name="model">library.book</field> 5 <field name="report_type">qweb-pdf</field> 6 <field name="report_name">biblioteca.report_library_book_document</field> 7 <field name="report_file">biblioteca.report_library_book_document</field> 8 <field name="print_report_name">'Ficha - %s' % (object.name)</field> 9 <field name="binding_model_id" ref="model_library_book"/> 10 <field name="binding_type">report</field> 11 </record> 12</odoo>
binding_model_id: Hace que el reporte aparezca automáticamente en el botón desplegable "Imprimir" en la vista de lista y formulario del modelo.
2. Plantilla QWeb del Documento (<template>) #
La plantilla define la estructura HTML del informe, utilizando el diseño corporativo estándar (web.external_layout):
1<odoo> 2 <template id="report_library_book_document"> 3 <t t-call="web.html_container"> 4 <t t-foreach="docs" t-as="doc"> 5 <t t-call="web.external_layout"> 6 <div class="page"> 7 <div class="row"> 8 <div class="col-12"> 9 <h2 class="text-primary text-center">Ficha del Libro</h2> 10 </div> 11 </div> 12 <div class="row mt-4"> 13 <div class="col-6"> 14 <p><strong>Título:</strong> <span t-field="doc.name"/></p> 15 <p><strong>Autor:</strong> <span t-field="doc.author"/></p> 16 <p><strong>ISBN:</strong> <span t-field="doc.isbn"/></p> 17 </div> 18 <div class="col-6"> 19 <p><strong>Precio:</strong> <span t-field="doc.price" t-options="{'widget': 'monetary', 'display_currency': doc.currency_id}"/></p> 20 <p><strong>Estado:</strong> <span t-field="doc.state"/></p> 21 </div> 22 </div> 23 <div class="row mt-3" t-if="doc.description"> 24 <div class="col-12"> 25 <h4>Sinopsis</h4> 26 <p t-field="doc.description"/> 27 </div> 28 </div> 29 </div> 30 </t> 31 </t> 32 </t> 33 </template> 34</odoo>
3. Directivas Esenciales de QWeb #
t-field: Renderiza el valor del campo con formateo automático según su tipo (fechas, monedas, widgets).t-esc: Renderiza texto plano o expresiones de Python escapadas.t-foreach="docs" t-as="doc": Itera sobre el conjunto de registros seleccionados.t-if="condición": Renderizado condicional de bloques HTML.
Resumen del tema
Conceptos clave #
- Motor de Reportes QWeb: renderizado dinámico de plantillas HTML compiladas a PDF mediante la utilidad de servidor
wkhtmltopdf. - Estructura de Plantillas XML:
<template id="...">: bloque de marcado con directivas QWeb (t-call="web.external_layout",t-foreach="docs",t-field,t-if).- Envoltorio estándar:
<div class="page">dentro del layout externo con cabecera y pie corporativo.
- Acción de Reporte (
ir.actions.report): registro moderno que define el modelo emisor, nombre del fichero PDF y enlace al menú de impresión (binding_model_id). - Herencia de Informes Existentes: extensión de plantillas estándar (facturas, albaranes, pedidos) mediante
inherit_idy expresiones<xpath>.
Qué debes recordar #
Los reportes en Odoo se diseñan con plantillas QWeb HTML/CSS compiladas a PDF con wkhtmltopdf y se activan mediante acciones ir.actions.report.