Odoo 10 Qweb PDF报告中自定义检查页面上的分页问题

时间:2019-07-05 10:00:16

标签: report odoo odoo-10 qwebview qweb

最近几天,我在Qweb报告中遇到了一些问题分页符。 我正在尝试将我的Qweb报告打印为Check格式,并将单个Qweb页面分为3个不同部分

第1部分:显示发票清单详细信息
第2部分:银行详细信息和我们将支付给MICR FONT 13B FONT的所有者/租户的金额
第3部分:显示发票清单详细信息

第1节和第3节是通用的,在两个节中显示相同的发票明细,关于第2节的内容将根据 我们将支付给所有者/房客的不同金额。

预期结果:

我有23张发票详细信息附在一张支票中,然后我希望将发票详细信息分叉到不同的位置

sloat 1::在首页显示前10个发票详细信息
sloat 2::将接下来的10张发票明细显示到第二页
sloat 3::将剩余3张发票明细显示到第三页

如果发票总数超过10行,我想将发票详细信息分成不同的分页

我已经尝试了什么?

尝试1::使用计数器变量并通过迭代循环来更新计数器,并在10达到除以0时中断该循环 将此代码应用于内部

<t t-set="count" t-value="count+1" />
    <t t-if="count%10== 0">
         <div style="page-break-after:auto;"/> 
    </t>
</t>

尝试2:

<span t-esc="line_index+1"/> 
<t t-if="line_index+1%10 ==0"> 
    <div style="page-break-inside:auto !important;"> 
</t>

2 个答案:

答案 0 :(得分:0)

我认为您需要提供更多的上下文和信息,也许问题出在您要暴露的问题之外。

您是否尝试过使用自定义的python报告?

class IncrementReports(models.AbstractModel):
    _name = 'report.your_model.your_report_name'

    @api.model
    def render_html(self, docids, data=None):
        report_obj = self.env['report']
        report = report_obj._get_report_from_name(
            'your_model.your_report_name')
        docs = []
        objects = self.env[report.model].browse(docids)            
        for o in objects:              

            docs.append({...})

        docargs = {
            'doc_ids': docids,
            'doc_model': report.model,
            'docs': objects,
            'custom_docs': docs,
            'datetime': datetime.datetime,
        }
        return report_obj.render('your_model.your_report_name', docargs)

使用自定义报告,您可以创建一个函数来划分3个信息块,将其发送到de docargs内部的不同变量中,然后遍历它们,而无需检查XML报告中的条件。

我不清楚我的英语水平不够好。

答案 1 :(得分:0)

在尝试了更多尝试之后,我也从头解决了该问题。

如果任何人在未来的发展中会遇到相同的问题
这样他们也可以快速修复它。

在特定模型中创建方法:(cheque.cheque模型)

def get_invoice_details(self, invoice_ids,cheque):
    vals,container,result,val=[],[],[],1
    invoice_no=''
    for line in invoice_ids:
        desc=''
        if line.is_vendor:
            invoice_no=line.vendor_reference
        else:
            invoice_no=line.number

        pay_amt=line.payment_ids.filtered(lambda m: m.cheque_issued_id.id ==cheque.id).amount or 0.00
        for l in line.invoice_line_ids:
            desc+=str(l.product_id.default_code)+',' or ''
        vals.append({
            'date':str(line.date_invoice),
            'invoice_no':invoice_no,
            'inv_amt':str(line.amount_total),
            'description':desc,
            'pay_amt':float(pay_amt)
        })
        invoice_no=''
    for l in vals:
        if val<=len(vals):
            container.append(l)
        if val % 9 == 0:
            result.append({'section':9,'vals':container})
            container=[]
        val+=1
    if container:
        result.append({'section':4,'vals':container})
    return result

在这种方法中,我将部分键及其值设置为字典列表的结果 我们使用同一部分使页面完美分页

调用相同的方法并将其迭代到Qweb模板中

<t t-foreach="o.get_invoice_details(o.invoice_ids,o)" t-as="line" >
                <div class="page">
                    <div class="col-xs-12">
                                <table style="width:100%">
                                    <thead>
                                        <tr>
                                            <th>Invoice Date</th>
                                            <th>Invoice # </th>
                                            <th>Invoice Amt</th>
                                            <th>Description  </th>
                                            <th style="text-align:right">Payment Amt</th>
                                        </tr>
                                    </thead>
                                    <t t-foreach="line.get('vals')" t-as="inv">
                                    <tbody class="sale_tbody">
                                        <tr>
                                            <td>
                                                <span t-esc="inv.get('date')" />
                                            </td>
                                            <td>                                                
                                                <span t-esc="inv.get('invoice_no')" />
                                            </td>
                                            <td>
                                                <span t-esc="o.decimal_formated_amount(float(inv.get('inv_amt',0.00)))" />
                                            </td>

                                            <td>
                                                <span t-esc="inv.get('description')" />
                                            </td>
                                            <td style="text-align:right">
                                                <span t-esc="o.decimal_formated_amount2(float(inv.get('pay_amt',0.00)))" />                                             

                                       </td>
                                        </tr>               
                                    </tbody>
                                    </t>
                                </table>
                        </div>
                      <span t-if="line.get('section') % 9 == 0" style="page-break-after: always;">
                      </span>
                </div>

根据get_invoice_details()方法的业务逻辑 它将以列表形式返回数据,然后我们可以使用相同的数据并将其呈现到XML模板中。

当条件满足XML模板时,Odoo将自动管理分页符 系统将根据源代码自动将页面分为两部分

我希望我的回答可能对您有所帮助:)