QWeb報告?
報表是使用HTML/QWeb編寫的,就像Odoo中的網站視圖一樣。您可以使用通常的 QWeb控制流工具 。PDF渲染本身由wkhtmltopdf_執行。
報表是使用 report action 聲明的,需要使用 報告模板 來指定該操作使用的模板。
如果有必要,可以為報表指定一個 紙張格式 。
報告模板?
報告模板將始終提供以下變量:
time
來自Python標準庫的
time
模塊的引用user
res.user
記錄,用于打印報告的用戶res_company
當前
用戶
公司的記錄website
當前網站對象(如果有)(此項可能存在但為
None
)web_base_url
Web服務器的基本URL
context_timestamp
將
datetime.datetime
對象從 UTC1 轉換為打印報告的用戶所在時區的函數
最小可行模板?
一個最簡模板看起來像這樣:
<template id="report_invoice">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="web.external_layout">
<div class="page">
<h2>Report title</h2>
<p>This object's name is <span t-field="o.name"/></p>
</div>
</t>
</t>
</t>
</template>
調用 external_layout
將在報表上添加默認的頁眉和頁腳。PDF 正文將是 <div class="page">
中的內容。模板的 id
必須是報表聲明中指定的名稱;例如上面的報表的名稱為 account.report_invoice
。由于這是一個 QWeb 模板,您可以訪問模板接收到的 docs
對象的所有字段。
默認情況下,渲染上下文還會公開以下項目:
docs
當前報告的記錄
doc_ids
docs
記錄的 ID 列表doc_model
docs
記錄的模型
如果您希望在模板中訪問其他記錄/模型,則需要: 自定義報表 ,但在這種情況下,如果您需要它們,您將不得不提供上述項目。
可翻譯的模板?
如果您想要翻譯報告(例如到合作伙伴的語言),您需要定義兩個模板:
主要報告模板
可翻譯的文檔
您可以使用屬性“t-lang”設置語言代碼(例如“fr”或“en_US”)或記錄字段,從主模板中調用可翻譯文檔。如果使用可翻譯字段(如國家名稱、銷售條件等),您還需要使用適當的上下文重新瀏覽相關記錄。
警告
如果您的報表模板不使用可翻譯的記錄字段,則不需要在其他語言中重新瀏覽記錄,這將影響性能。
例如,讓我們來看一下銷售模塊中的銷售訂單報告:
<!-- Main template -->
<template id="report_saleorder">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="sale.report_saleorder_document" t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
<!-- Translatable template -->
<template id="report_saleorder_document">
<!-- Re-browse of the record with the partner lang -->
<t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)" />
<t t-call="web.external_layout">
<div class="page">
<div class="oe_structure"/>
<div class="row">
<div class="col-6">
<strong t-if="doc.partner_shipping_id == doc.partner_invoice_id">Invoice and shipping address:</strong>
<strong t-if="doc.partner_shipping_id != doc.partner_invoice_id">Invoice address:</strong>
<div t-field="doc.partner_invoice_id" t-options="{"no_marker": True}"/>
<...>
<div class="oe_structure"/>
</div>
</t>
</template>
主模板調用可翻譯模板,使用 doc.partner_id.lang
作為 t-lang
參數,因此它將以客戶的語言呈現。這樣,每個銷售訂單都將以相應客戶的語言打印。如果您只想翻譯文檔正文,但保留頁眉和頁腳的默認語言,則可以按以下方式調用報告的外部布局::
<t t-call="web.external_layout" t-lang="en_US">
小技巧
請注意,這僅適用于調用外部模板時,您將無法通過在xml節點上設置“t-lang”屬性來翻譯文檔的一部分,除非該節點是“t-call”。如果您想翻譯模板的一部分,您可以創建一個包含該部分模板的外部模板,并在主模板中使用“t-lang”屬性調用它。
條形碼?
條形碼是由控制器返回的圖像,可以通過QWeb語法輕松地嵌入報告中(例如,請參見 屬性 ):
<img t-att-src="'/report/barcode/QR/%s' % 'My text in qr code'"/>
更多參數可以作為查詢字符串傳遞
<img t-att-src="'/report/barcode/?
barcode_type=%s&value=%s&width=%s&height=%s'%('QR', 'text', 200, 200)"/>
有用的備注?
Twitter Bootstrap和FontAwesome類可以在您的報告模板中使用
本地CSS可以直接放在模板中
全局 CSS 可以通過繼承主報表布局并插入您的 CSS 來插入:
<template id="report_saleorder_style" inherit_id="report.style"> <xpath expr="."> <t> .example-css-class { background-color: red; } </t> </xpath> </template>
如果您的PDF報告缺少樣式,請檢查 這些說明 。
紙張格式?
紙張格式是 report.paperformat
的記錄,可以包含以下屬性:
name
(必填)僅在某種列表中查找報告時作為助記符/描述有用
description
您的格式的簡短描述
format
可以選擇預定義格式(A0到A9,B0到B10,Legal,Letter,Tabloid等)或“custom”;默認為A4。如果定義了頁面尺寸,則不能使用非自定義格式。
dpi
輸出 DPI;默認為 90
margin_top
,margin_bottom
,margin_left
,margin_right
毫米為單位的邊距大小
page_height
,page_width
頁面尺寸(毫米)
orientation
橫向或縱向
header_line
布爾值,用于顯示標題行
header_spacing
頁眉間距(毫米)
示例:
<record id="paperformat_frenchcheck" model="report.paperformat">
<field name="name">French Bank Check</field>
<field name="default" eval="True"/>
<field name="format">custom</field>
<field name="page_height">80</field>
<field name="page_width">175</field>
<field name="orientation">Portrait</field>
<field name="margin_top">3</field>
<field name="margin_bottom">3</field>
<field name="margin_left">3</field>
<field name="margin_right">3</field>
<field name="header_line" eval="False"/>
<field name="header_spacing">3</field>
<field name="dpi">80</field>
</record>
自定義報告?
默認情況下,報告系統基于通過“model”字段指定的目標模型構建渲染值。
然而,它首先會查找一個名為 report.module.report_name
的模型,并調用該模型的 _get_report_values(doc_ids, data)
方法,以準備模板的渲染數據。
這可以用于在渲染模板時包含任意項目以使用或顯示,例如來自其他模型的數據:
from odoo import api, models
class ParticularReport(models.AbstractModel):
_name = 'report.module.report_name'
def _get_report_values(self, docids, data=None):
# get the report action back as we will need its data
report = self.env['ir.actions.report']._get_report_from_name('module.report_name')
# get the records selected for this rendering of the report
obj = self.env[report.model].browse(docids)
# return a custom rendering context
return {
'lines': docids.get_lines()
}
警告
使用自定義報表時,“默認”的與文檔相關的項目( doc_ids
、 doc_model
和 docs
)將不會包括在內。如果您需要它們,您需要自己包含它們。
在上面的例子中,渲染上下文將包含“全局”值以及我們放置在其中的 lines
,但不包括其他任何內容。
自定義字體?
如果您想使用自定義字體,您需要將自定義字體及其相關的less/CSS添加到 web.reports_assets_common
資源包中。將自定義字體添加到 web.assets_common
或 web.assets_backend
將無法使您的字體在QWeb報告中可用。
示例:
<template id="report_assets_common_custom_fonts" name="Custom QWeb fonts" inherit_id="web.report_assets_common">
<xpath expr="." position="inside">
<link href="/your_module/static/src/less/fonts.less" rel="stylesheet" type="text/less"/>
</xpath>
</template>
即使您在其他資產包(而非 web.reports_assets_common
)中使用了字體,您也需要在此less文件中定義您的 @font-face
。
示例:
@font-face {
font-family: 'MonixBold';
src: local('MonixBold'), local('MonixBold'), url(/your_module/static/fonts/MonixBold-Regular.otf) format('opentype');
}
.h1-title-big {
font-family: MonixBold;
font-size: 60px;
color: #3399cc;
}
在將less添加到資產包中后,您可以在自定義QWeb報告中使用類 - 在此示例中為“h1-title-big”。
報告是網頁?
報告是由報告模塊動態生成的,可以通過URL直接訪問:
例如,您可以通過訪問“http://<server-address>/report/html/sale.report_saleorder/38”以HTML模式訪問銷售訂單報告
或者您可以通過以下鏈接訪問PDF版本:http://<server-address>/report/pdf/sale.report_saleorder/38
- 1
無論
python:datetime
對象實際處于哪個時區(包括沒有時區),它的時區都將被 設置 為UTC,然后再調整為用戶的時區。