odoo--打印功能(qweb_report)下载pdf
- 在项目文件夹“my_cats”的data文件夹中创建一个文件"cat_report.xml",用于配置说明哪个模块需要增加下载pdf的功能
- 写入代码:
<odoo>
<report
id="report_mycat"
model="my.cats"
string="下载猫猫信息报告"
name="my_cats.report_myproject_report_templates"
print_report_name = "'猫猫报告'+ str(object.code)"
report_type="qweb-pdf" />
</odoo>
<!--
id:节点id
model:生成报告的模块名
string:UI显示用于下载报告按钮的文本
name:调用生成报告的方法名
print_report_name:返回报告的名称。 点击打印或下载按钮时使用此名称来保存下载报告(我这里的报告名引入了模块中的猫猫编号字段“code”)
-->
- 在model文件夹中创建“cat_report.py”文件,用于定义刚刚在文件"cat_report.xml"提到的方法name
- 写入代码:
from odoo import api, fields ,models
class ParticularReport(models.AbstractModel):
_name = 'my_cats.report'
#重写了odoo的_get_report_values方法
def _get_report_values(self, docids, data=None):
#定位到odoo存放report的表
report_obj = self.env['ir.actions.report']
#找到“cat_report.xml”所定义的name指向的model生成的report
#使用_get_report_from_name()方法从报告名称返回与报告关联的ir.actions.report的记录
#'my_cats.report_myproject_report_templates'是指my_cats项目文件夹下名为“report_myproject_report_templates”的配置文件
report = report_obj._get_report_from_name('my_cats.report_myproject_report_templates')
#doc_ids是传递给报告模板的记录ID列表,doc_model描述了这些记录所属的模型,docs包含引用self(当前调用该方法的对象)以及其他相关数据的对象。
docargs = {
'doc_ids': docids,
'doc_model': report.model,
'docs': self,
}
return docargs
- 别忘记在init文件中引入
- 在views视图文件夹下创建“cat_report_template.xml”文件,用于定义报告内容的展示格式
- 写入代码:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- 这里的id引用cat_report.xml定义的name中除去项目名称 -->
<template id="report_myproject_report_templates">
<!-- 调用了 Odoo 中内置的名为 web.html_container 的布局模板-->
<t t-call="web.html_container">
<!-- 遍历一个叫做 docs 的变量,并把每个元素赋值给一个叫做 doc 的临时变量 -->
<t t-foreach="docs" t-as="doc">
<!-- 调用外部布局,即对于该模板所渲染的内容,在呈现时会先套用一个外部的布局文件(通常包含网站头、底部等公共页面结构) -->
<t t-call="web.external_layout">
<div class="page">
<h4 style="text-align: center">猫猫信息表</h4>
<table style="width: 100%;">
<tr>
<td class="nowrap" colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: max-content;">猫猫编号</td>
<td class="nowrap" colspan="30" style="padding-left: 10px; border: 1px solid black; vertical-align: middle; height:40px; width: max-content;">
<span t-field="doc.code"></span>
</td>
</tr>
<tr>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 12.5%">名称</td>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 12.5%">
<span t-field="doc.name"></span>
</td>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 12.5%">品种类型</td>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 12.5%">
<span t-field="doc.cat_type"></span>
</td>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 12.5%">出生日期</td>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 12.5%">
<span t-field="doc.born_date"></span>
</td>
</tr>
<tr>
<td class="nowrap" colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: max-content;">猫舍</td>
<td class="nowrap" colspan="12" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: max-content;">
<span t-field="doc.cats_home.name"></span>
</td>
<td class="nowrap" colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: max-content;">入店时间</td>
<td class="nowrap" colspan="12" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: max-content;">
<span t-field="doc.doing_date"></span>
</td>
</tr>
<tr>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:150px; width: 16.67%">收养信息</td>
<td colspan="30" style="text-align: center; height:150px; width: 16.67%">
<table style="width: 100%;">
<tr>
<td colspan="10" style="text-align: center; vertical-align: middle; height:25px; width: 16.67%">是否被收养</td>
<td colspan="10" style="text-align: center; vertical-align: middle; height:25px; width: 16.67%">最后被收养时间</td>
<td colspan="10" style="text-align: center; vertical-align: middle; height:25px; width: 16.67%">最后归还时间</td>
</tr>
<tr>
<td colspan="10" style="text-align: center; height:150px; width: 16.67%">
<t t-esc="'已领养' if doc.borrowed else '未领养'"/>
</td>
<td colspan="10" style="text-align: center; height:150px; width: 16.67%">
<span t-field="doc.date_last_borrowed"></span>
</td>
<td colspan="10" style="text-align: center; height:150px; width: 16.67%">
<span t-field="doc.date_last_return"></span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">猫咪性格</td>
<td colspan="30" style="padding-left: 10px; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">
<t t-foreach="doc.personality_id" t-as="personality">
<span t-field="personality.name" />
</t>
</td>
</tr>
<tr>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">备注</td>
<td colspan="30" style="padding-left: 10px; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">
<span t-field="doc.description"></span>
</td>
</tr>
<tr>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">定价</td>
<td colspan="12" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">
<span t-field="doc.price"></span>
</td>
<td colspan="6" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">填报人</td>
<td colspan="12" style="text-align: center; border: 1px solid black; vertical-align: middle; height:40px; width: 16.67%">
<span t-field="doc.create_user_id.name"></span>
</td>
</tr>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>
- 在上述代码中 t-field写入model中定义的字段,若字段涉及many2many,需要增加循环遍历
# model中定义的字段
personality_id = fields.Many2many('personality',string='猫咪性格')
<t t-foreach="doc.personality_id" t-as="personality">
<span t-field="personality.name" />
</t>
-
最后别忘记在manifest文件中引入新增的xml文件:
-
呈现效果: