【odoo15】odoo中用向导创建PDF报告,并添加简单的打印条件

添加了一个三级菜单,由此创建向导,可选择按照性别分类进行打印,打印符合条件的PDF报表

打印出的PDF表如图所示:

 代码部分:先写向导部分,创建一个新的向导 patient_report:【向导文件放在wizard里】

py文件代码:【all_patient_report.py】

from odoo import fields, models, api, _


class PatientReportWizard(models.TransientModel):
    _name = "patient.report.wizard"
    _description = "这是一个瞬态模型patient_report_wizard"

    gender = fields.Selection([('male', '男的'), ('female', '女的'), ('other', '其它')],
                              required=True, default='other')
    age = fields.Integer(string="Age")

    def action_print_report(self):
        data = {
            'form_data': self.read()[0],
            'email': '6370@163.com',
        }
        return self.env.ref('mysale.action_report_all_patient_details').report_action(self, data=data)

xml文件代码:【all_patient_report_view.xml】

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
    <record id="action_report_patient" model="ir.actions.act_window">
        <field name="name">patient_report</field>
        <field name="type">ir.actions.act_window</field>
        <field name="res_model">patient.report.wizard</field>
        <field name="view_mode">form</field>
        <field name="view_id" ref="view_report_patient_form"/>
        <field name="target">new</field>
    </record>

    <record id="view_report_patient_form" model="ir.ui.view">
        <field name="name">patient_report_form</field>
        <field name="model">patient.report.wizard</field>
        <field name="arch" type="xml">
            <form string="创建一个向导">
                <group>
                    <group>
                         <field name="gender"/>
                    </group>
                   <group>
                         <field name="age"/>
                    </group>
                </group>
                <footer>
                    <button name="action_print_report" string="打印" type="object" class="btn-primary"/>
                    <button string="取消" class="btn-secondary" special="cancel"/>
                </footer>
            </form>
        </field>
    </record>

    <menuitem id="menu_print_report"
              name="create_print_report"
              parent="menu_1_list"
              action="action_report_patient"
              sequence="35"/>
</odoo>


还是要在init与manifest文件里配置一下的,导入模块以及添加视图文件,还有就是设置权限。

再写报告与模板部分:放在【report】文件中:

 py文件代码:【all_patient_report.py】

from odoo import api, fields, models


class AllPatientReport(models.AbstractModel):
    _name = 'report.mysale.report_all_patient_list'
    _description = 'patient Report'

    @api.model
    def _get_report_values(self, docids, data=None):
        print("----", docids, data)
        domain = []
        gender = data.get('form_data').get('gender')
        age = data.get('form_data').get('age')
        if gender:
            domain += [('gender', '=', gender)]
        if age != 0:
            domain += [('age', '=', age)]
        docs = self.env['mysale.mysale'].search(domain)
        return {
            'docs': docs,
            'email': '6370@163.com'
        }

这里是一个简单逻辑:首先我们可以先打印出来data里边的东西看一下:【data内容】

---- None {'context': {'lang': 'zh_CN', 'tz': 'Asia/Shanghai', 
'uid': 2, 'allowed_company_ids': [1], 'active_model': 'patient.report.wizard', 
'active_id': 18, 'active_ids': [18]}, 
'form_data': {'id': 18, 'gender': 'other', 'age': 0, 
'__last_update': '2022-04-24 08:18:12', 
'display_name': 'patient.report.wizard,18', 
'create_uid': [2, 'Administrator'], 'create_date': '2022-04-24 08:18:12',
 'write_uid': [2, 'Administrator'], 'write_date': '2022-04-24 08:18:12'}, 
'email': '6370@163.com', 'report_type': 'pdf'}

'form_data'出现在wizard/all_patient_report.py中,从data.get('form_data').get('gender')拿到gender里边的value然后进行对比判断里边的值是【male】【female】或者【other】然后通过domain域做筛选,年龄判断的话不为0即可。email字段下面再说。

xml文件代码:【all_patient_list.xml】

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <template id="report_all_patient_list">
        <t t-call="web.html_container">
            <t t-call="web.external_layout">
                <div class="page">
                    <div class="oe_structure"/>
                    <div class="text-center">
                        <h2>Patients</h2>
                    </div>
                    <br/>
                    <table class="table table-bordered mt32">
                        <thead>
                            <tr>
                                <th name="th_name" class="text-left">
                                    <span>Name</span>
                                </th>
                                <th name="th_name" class="text-left">
                                    <span>Gender</span>
                                </th>
                                <th name="th_name" class="text-left">
                                    <span>Age</span>
                                </th>
                            </tr>
                        </thead>
                        <span>Email
                            <t t-esc="email"/>
                        </span>
                        <t t-foreach="docs" t-as="line">
                            <tr>
                                <td>
                                    <span t-field="line.name"/>
                                </td>

                                <td>
                                    <span t-field="line.gender"/>
                                </td>

                                <td>
                                    <span t-field="line.age"/>
                                </td>
                            </tr>
                        </t>
                    </table>
                </div>
            </t>
        </t>
    </template>
</odoo>

模板中添加email的视图   <span>Emai  l<t t-esc = "email"/  ></span>report的py的return中添加了'email': '自定义的邮箱@163.com'在模板中能直接显示出来打印,但是控制台的data里拿不到,把这个'email': '自定义的邮箱@163.com'放在瞬态模型的py中控制台输出data中就能拿得到email这个字段以及后面的值,暂且没搞懂,记录一下以后研究。

xml文件代码:【report.xml】

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>

    <record id="action_report_all_patient_details" model="ir.actions.report">
        <field name="name">patient details</field>
        <field name="model">patient.report.wizard</field>
        <field name="report_type">qweb-pdf</field>
        <field name="report_name">mysale.report_all_patient_list</field>
        <field name="report_file">mysale.report_all_patient_list</field>
        <field name="binding_model_id" ref="model_mysale_mysale"/>
        <field name="binding_type">report</field>
    </record>

</odoo>

在report.xml里添加的动作都是ir.actions.report的动作,直接在这里显示:【patient details】

 这个动作ID【action_report_all_patient_details】在瞬态模型的return中出现过,应该是它的一个return动作

至于打印出来的公司logo与公司名可以在: 【设置---> 用户和公司--->公司】中设置。

总结:本节非常的迷茫,并没有搞太懂这个案例,如果可以我希望能听中文的视频,英文的教程真是太难懂了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值