| name | odoo-qweb-templates |
| description | Expert in Odoo QWeb templating for PDF reports, email templates, and website pages. Covers t-if, t-foreach, t-field, and report actions. |
| category | AI & Agents |
| source | antigravity |
| tags | ["python","javascript","pdf","ai","workflow","template","design"] |
| url | https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/odoo-qweb-templates |
Odoo QWeb Templates
Overview
QWeb is Odoo's primary templating engine, used for PDF reports, website pages, and email templates. This skill generates correct, well-structured QWeb XML with proper directives, translation support, and report action bindings.
When to Use This Skill
- Creating a custom PDF report (invoice, delivery slip, certificate).
- Building a QWeb email template triggered by workflow actions.
- Designing Odoo website pages with dynamic content.
- Debugging QWeb rendering errors (
t-if, t-foreach issues).
How It Works
- Activate: Mention
@odoo-qweb-templates and describe the report or template needed.
- Generate: Receive a complete
ir.actions.report record and QWeb template.
- Debug: Paste a broken template to identify and fix rendering issues.
Examples
Example 1: Custom PDF Report
<record id="action_report_patient_card" model="ir.actions.report">
<field name="name">Patient Card</field>
<field name="model">hospital.patient</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">hospital_management.report_patient_card</field>
<field name="binding_model_id" ref="model_hospital_patient"/>
</record>
<template id="report_patient_card">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.external_layout">
<div =>
Patient Card
Name:
Doctor:
Status:
Example 2: Conditional Rendering
<t t-if="doc.state == 'draft'">
<div class="alert alert-warning">
<strong>Warning:</strong> This patient has not been confirmed yet.
</div>
</t>
Best Practices
- ✅ Do: Use
t-field for model fields — Odoo auto-formats dates, monetary values, and booleans correctly.
- ✅ Do: Use
t-out (Odoo 15+) for safe HTML output of non-field strings. Use t-esc only on Odoo 14 and below (it HTML-escapes output).
- ✅ Do: Call
web.external_layout for PDF reports to automatically include the company header, footer, and logo.
- ✅ Do: Use
_lt() (lazy translation) for translatable string literals inside Python report helpers, not inline t-esc.
- ❌ Don't: Use raw Python expressions inside QWeb — compute values in the model or a report
_get_report_values() helper.
- ❌ Don't: Forget
t-as when using t-foreach; without it, you can't access the current record in the loop body.
- ❌ Don't: Use
t-esc where you intend to render HTML content — it will escape the tags and print them as raw text.
Limitations
- Does not cover website controller routing for dynamic QWeb pages — that requires Python
http.route knowledge.
- Email template QWeb has different variable scope than report QWeb (
object vs docs) — this skill primarily focuses on PDF reports.
- QWeb JavaScript (used in Kanban/Form widgets) is a different engine; this skill covers server-side QWeb only.
- Does not cover wkhtmltopdf configuration for PDF rendering issues (page size, margins, header/footer overlap).