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="{&quot;no_marker&quot;: 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&amp;value=%s&amp;width=%s&amp;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_modeldocs )將不會包括在內。如果您需要它們,您需要自己包含它們。

在上面的例子中,渲染上下文將包含“全局”值以及我們放置在其中的 lines ,但不包括其他任何內容。

自定義字體?

如果您想使用自定義字體,您需要將自定義字體及其相關的less/CSS添加到 web.reports_assets_common 資源包中。將自定義字體添加到 web.assets_commonweb.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,然后再調整為用戶的時區。