odoo-qweb-templates について
サーバー側のOdoo QWebテンプレートを作成・デバッグするスキルで、主にPDFレポートを対象とします。ディレクティブ、翻訳対応、レポートアクションのバインディングを備えたXML作成を支援します。
主な機能
- 01QWeb XMLテンプレートの生成
- 02PDFレポートアクションのバインディング作成
- 03レンダリングディレクティブのデバッグ
- 04フィールド書式と出力エスケープの適用
- 05レポート文字列の翻訳対応
活用シーン
- 01請求書や納品書レポートの作成
- 02ワークフロー起動メールテンプレートの構築
- 03動的コンテンツを含むウェブページの設計
- 04t-ifやt-foreachのレンダリング問題の修正
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill odoo-qweb-templatesインストール後、Claude Code で/odoo-qweb-templatesを入力して読み込まれたか確認します。
詳細
Odoo QWeb テンプレート
概要
QWeb は Odoo の主要なテンプレートエンジンで、PDF レポート、ウェブサイトのページ、メールテンプレートに使用されます。このスキルでは、適切なディレクティブ、翻訳サポート、レポートアクションとのバインドを備えた、正しく構造化された QWeb XML を生成します。
このスキルを使用する場面
- カスタム PDF レポート(請求書、納品書、証明書)を作成する。
- ワークフローアクションによって呼び出される QWeb メールテンプレートを構築する。
- 動的コンテンツを含む Odoo ウェブサイトのページを設計する。
- QWeb のレンダリングエラー(
t-if、t-foreachの問題)をデバッグする。
仕組み
- 有効化:
@odoo-qweb-templatesに言及し、必要なレポートまたはテンプレートを説明します。 - 生成:完全な
ir.actions.reportレコードと QWeb テンプレートを受け取ります。 - デバッグ:問題のあるテンプレートを貼り付けて、レンダリングの問題を特定し、修正します。
例
例 1:カスタム PDF レポート
<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 class="page">
<h2>Patient Card</h2>
<table class="table table-bordered">
<tr>
<td><strong>Name:</strong></td>
<td><t t-field="doc.name"/></td>
</tr>
<tr>
<td><strong>Doctor:</strong></td>
<td><t t-field="doc.doctor_id.name"/></td>
</tr>
<tr>
<td><strong>Status:</strong></td>
<td><t t-field="doc.state"/></td>
</tr>
</table>
</div>
</t>
</t>
</t>
</template>
例 2:条件付きレンダリング
<t t-if="doc.state == 'draft'">
<div class="alert alert-warning">
<strong>Warning:</strong> This patient has not been confirmed yet.
</div>
</t>
ベストプラクティス
- ✅ 推奨: モデルのフィールドには
t-fieldを使用します。Odoo が日付、金額、ブール値を適切に自動フォーマットします。 - ✅ 推奨: 通常の文字列をエスケープして出力するには
t-outを使用します。Odoo 17 ではt-escも引き続きエイリアスとして使用できます。すでに安全とマークされている値については、別途信頼性を確認してください。 - ✅ 推奨: PDF レポートでは
web.external_layoutを呼び出し、会社のヘッダー、フッター、ロゴを自動的に含めます。 - ✅ 推奨: Python のレポートヘルパー内で翻訳可能な文字列リテラルを使う場合は、インラインの
t-escではなく_lt()(遅延翻訳)を使用します。 - ❌ 非推奨: QWeb に複雑なビジネスロジックや副作用を含めないでください。単純な式は使用できますが、複雑な値はモデルまたはレポートの
_get_report_values()ヘルパーで計算してください。 - ❌ 非推奨:
t-foreachを使用する際にt-asを忘れないでください。指定しないと、ループ本体で現在のレコードにアクセスできません。 - ❌ 非推奨: 信頼できない HTML をレンダリングするためにエスケープを回避しないでください。リッチコンテンツは、対象の Odoo バージョンでサポートされている仕組みを使ってサニタイズしてください。コンテンツを安全とマークすることは、セキュリティ上の判断を伴います。
参考資料:Odoo 17 QWeb。このサンプルには、カスタムモデル、フィールド、アクセスルール、モジュールの XML ラッパーが必要です。権限を持つユーザーでレンダリングをテストし、患者データの公開は避けてください。
制限事項
- 動的な QWeb ページのウェブサイトコントローラーのルーティングには対応していません。Python の
http.routeに関する知識が必要です。 - メールテンプレートの QWeb は、レポート用 QWeb とは変数のスコープ(
objectとdocs)が異なります。このスキルは主に PDF レポートを対象としています。 - QWeb JavaScript(Kanban/Form ウィジェットで使用)は別のエンジンです。このスキルではサーバーサイド QWeb のみを対象としています。
- PDF レンダリングの問題(ページサイズ、余白、ヘッダーとフッターの重なり)に関する wkhtmltopdf の設定には対応していません。
コメント
Markdown 対応