odoo14打印报表详解

标题打印报表详解

定义一个需要打印按钮的模型

# -*- coding: utf-8 -*-

from odoo import models, fields, api


class openshoes(models.Model):
    _name = 'openshoes.openshoes'
    _description = 'openshoes.openshoes'

    c_name = fields.Char('工厂名称')
    price = fields.Float('金额')
    name = fields.Char('负责人')
    date_1 = fields.Date('订单日期')
    type = fields.Selection(selection=[('sample', '样品'), ('development', '开发'), ('production', '批量')], string="测试性质",
                            help="选择", default="sample")

创建一个report的python文件夹,项目结构后面有

创建一个openshoes_report_pzqweb.py

这里拿我本地项目举例

from odoo import models, api

class report2(models.Model):
    # _name内容由三个部分组成  report+关联模块名+openshoes_report_pzqweb.xml模板id组成(后面创建的xml文件,在下面)
    _name = 'report.openshoes.report_library_book_template'

    def _get_data(self,ids):
        #sql语句查询模型表
        sql = "select * from openshoes_openshoes"
        # 四种查询方法
        # cr.dictfetchall() 得到 [{'reg_no': 123},{'reg_no': 543},]
        # cr.dictfetchone() 得到 {'reg_no': 123}
        # cr.fetchall() 得到 '[(123),(543)]'
        # cr.fetchone() 得到 '(123)'
        # 参考https://blog.csdn.net/qq_29654325/article/details/78019686
        self.env.cr.execute(sql)
        # DictObj类实现dict转为对象属性,从而数据访问可以通过对象方式访问
        #例data2['name']转换成data2.name
        # 参考https://blog.csdn.net/hk52222/article/details/103214581
        return DictObj(self.env.cr.dictfetchall()[0])

    @api.model
    def _get_report_values(self,docids,data= None):
        docArgs = {
            'title2':"Test Title",
            'data2':self._get_data(docids)
                   }
        return docArgs

class DictObj(object):
    def __init__(self, map):
        self.map = map

    def __setattr__(self, name, value):
        if name == 'map':
            object.__setattr__(self, name, value)
            return;
        print('set attr called ', name, value)
        self.map[name] = value

    def __getattr__(self, name):
        v = self.map[name]
        if isinstance(v, (dict)):
            return DictObj(v)
        if isinstance(v, (list)):
            r = []
            for i in v:
                r.append(DictObj(i))
            return r
        else:
            return self.map[name];

    def __getitem__(self, name):
        return self.map[name]

创建一个openshoes_report_pzqweb.xml


<odoo>
    <data>

        <report id="action_library_book_report"
                string="打印"
                model="openshoes.openshoes"
                report_type="qweb-html"
                name="openshoes.report_library_book_template"
        />

        <template id="report_library_book_template">
            <t t-call="web.html_container">
                <t t-call="web.external_layout">
                    <div class="page">

                        <t t-esc="title2"/>
                        <h2>Report titleh2>
                        <p>This object's name is

                            <t t-esc="data2.name"/>
                        p>
                    div>
                t>
            t>
        template>

    data>
odoo>

openshoes.openshoes模型视图自写

最后是三个导入

  1. odoo14打印报表详解_第1张图片
  2. odoo14打印报表详解_第2张图片
  3. odoo14打印报表详解_第3张图片

最后得到

odoo14打印报表详解_第4张图片
并且点击打印可以得到pdf文件。

至此结束。

你可能感兴趣的:(odoo,odoo,odoo14,打印报表)