Odoo 10 Qweb PDF 报告中自定义检查页面的分页问题
Page Break Issue On Custom Cheque Page in Odoo 10 Qweb PDF Report
最近几天我在 Qweb 报告中遇到了一些页面中断问题。
我正在尝试打印我的 Qweb 报告以检查格式和分为 3 个不同部分的单个 Qweb 页面
第 1 部分:显示发票清单详细信息
第 2 部分:银行详细信息和我们将以 MICR FONT 13B FONT
支付给 owner/tenant 的金额
第 3 部分:显示发票清单详细信息
第 1 部分和第 3 部分是通用的,在这两个部分中显示相同的发票详细信息,关于第 2 部分的详细信息将根据
我们将支付给 owner/tenant.
的不同金额
预期结果:
我有 23 个发票详细信息附在单张支票中,然后我想将我的发票详细信息分叉到不同的插槽中
sloat 1 : 在第一页显示前 10 个发票详细信息
sloat 2 : 在第二页中显示接下来的 10 个发票详细信息
sloat 3 : 在第三页显示 remaning 3 发票详细信息
如果发票总数超过 10 行,我想将我的发票详细信息分成不同的 sloat 明智页面
我从身边尝试过什么?
尝试 1: 使用计数器变量并通过迭代循环更新计数器并在 10 达到除以 0 时中断它
将此代码应用到 loping
<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>
我认为你需要提供更多的上下文和信息,也许问题与你所暴露的不同。
您是否尝试过使用自定义 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 报告中的条件的情况下迭代它们。
不知道我说的清楚没有,我的英文不够好
经过多次尝试,我也从头解决了这个问题。
如果有人在你以后的发展中遇到同样的问题
以便他们也能够快速修复它。
在特定模型中创建方法:(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()方法的业务逻辑
这是 return 列表形式的数据,然后我们可以使用相同的数据并将其呈现到 XML 模板中。
当条件满足 XML 模板时,Odoo 将自动管理分页符
系统会根据源码自动分页
希望我的回答对您有所帮助:)
最近几天我在 Qweb 报告中遇到了一些页面中断问题。 我正在尝试打印我的 Qweb 报告以检查格式和分为 3 个不同部分的单个 Qweb 页面
第 1 部分:显示发票清单详细信息
第 2 部分:银行详细信息和我们将以 MICR FONT 13B FONT
支付给 owner/tenant 的金额
第 3 部分:显示发票清单详细信息
第 1 部分和第 3 部分是通用的,在这两个部分中显示相同的发票详细信息,关于第 2 部分的详细信息将根据 我们将支付给 owner/tenant.
的不同金额预期结果:
我有 23 个发票详细信息附在单张支票中,然后我想将我的发票详细信息分叉到不同的插槽中
sloat 1 : 在第一页显示前 10 个发票详细信息
sloat 2 : 在第二页中显示接下来的 10 个发票详细信息
sloat 3 : 在第三页显示 remaning 3 发票详细信息
如果发票总数超过 10 行,我想将我的发票详细信息分成不同的 sloat 明智页面
我从身边尝试过什么?
尝试 1: 使用计数器变量并通过迭代循环更新计数器并在 10 达到除以 0 时中断它 将此代码应用到 loping
<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>
我认为你需要提供更多的上下文和信息,也许问题与你所暴露的不同。
您是否尝试过使用自定义 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 报告中的条件的情况下迭代它们。
不知道我说的清楚没有,我的英文不够好
经过多次尝试,我也从头解决了这个问题。
如果有人在你以后的发展中遇到同样的问题
以便他们也能够快速修复它。
在特定模型中创建方法:(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()方法的业务逻辑 这是 return 列表形式的数据,然后我们可以使用相同的数据并将其呈现到 XML 模板中。
当条件满足 XML 模板时,Odoo 将自动管理分页符 系统会根据源码自动分页
希望我的回答对您有所帮助:)