【问题标题】:How to make a file downloadable in Odoo Python?如何在 Odoo Python 中使文件可下载?
【发布时间】:2015-03-13 14:41:58
【问题描述】:

我在我的模块中创建了一个生成静态 Excel 报告的向导,它运行良好。问题是有些客户远程访问我的模块,当他们打开向导并单击按钮时,生成的报告会保存在我的本地驱动器上,但他们什么也得不到,是否有任何解决方案可以将我的 XLSX 报告作为可下载文件和客户可以直接下载吗?

这是我尝试过的,但没有成功:

data = wizard.plugin_file
file_path = wizard.file_path
my_report_data = open('C:/Users/Report.xlsx','rb')
f = my_report_data.read()
output = base64.encodestring(f)
self.write(cr, uid, ids[0], {'plugin_file': output}, context = context)
view_obj = self.pool.get('ir.ui.view')
view_id = view_obj.search(cr, uid, [('model', '=', 'report.model'), \
                            ('name', '=', 'report_model_form_view2')])

return {
    'name': 'Monthly Report ',
    'view_type': 'form',
    'view_mode': 'form',
    'res_model': 'report.model',
    'view_id': view_id, 'form'
    'res_id': ids[0],
    'type': 'ir.actions.act_window',
    'target': 'new',
    'context': context,
}

表格:

<field name="file_path" invisible="1"/>
<field name="plugin_file" filename="file_path"/>

【问题讨论】:

标签: python python-3.x download odoo


【解决方案1】:

以下代码在导出 csv 文件时运行良好。

import cStringIO
import base64
def your_export_function(self):
    fd = cStringIO.StringIO()
    #use this file descriptor instead of file path
    #after loading everydata to your file discriptor
    out = base64.encodestring(fd.getvalue())
    fd.close()        
    self.write(cr, uid, ids, { 'data':out}, context=context) #data is the binary field in openerp

【讨论】:

    【解决方案2】:

    典型的模式是:

    1. 在您的向导模型上创建一个二进制类型的字段并将其放在您的表单上。

      'report_result': fields.binary('下载文件',readonly=True),

    2. 生成报告后,对其进行 base64 编码并将其写回向导。

      输出 = base64.encodestring(my_report_data) self.write(cr, uid, ids[0], {'report_result': output}, context = context)

    3. 返回一个窗口操作,以便重新显示弹出窗口。数据字段现在将成为他们可以单击的下载字段。

      返回 { “类型”:“ir.actions.act_window”, 'res_model': 'my.report.model', 'view_mode': '形式', 'view_type': '表格', “res_id”:wizard.id, “目标”:“新”, }

    对于奖励积分,您可以控制下载文件的名称,使其具有唯一性,或者在文件名中包含合作伙伴名称或日期。在您的向导上创建一个字符或函数字段,并在您编写报告结果的同时将文件名写入其中。然后,当您在表单上定义报告结果字段时,将名称作为属性包含在这样的属性中。

    <field name="my_file_name_field" invisible="1"/>
    <field name="report_result" filename="my_file_name_field"/>
    

    【讨论】:

    • 感谢您的回复。我尝试了您的解决方案,但我不明白 [(my_report_data)] 的意思是什么?是浏览记录吗?在我的情况下,我从我的向导中写了一条浏览记录。它在 encodestring TypeError 中抛出了这个错误文件“base64.pyc”,第 313 行:类型为“bool”的对象没有 len()
    • 不,那是你报告的内容。我假设您正在使用报表服务来生成 PDF 或 Excel 库来生成电子表格。无论哪种情况,您都需要对其进行 base64 编码,以便将其写入向导记录。
    • 我正在使用 Python XlsxWriter 包生成 Excel 报告,我将报告的路径 ('c:/Users/My_repot.xlsx' ) 分配给 [My_report_data] 然后读取它并编码 base64,这次它没有抛出任何错误,但没有发生任何事情意味着它没有写入二进制字段
    【解决方案3】:

    使用 Odoo 11,您可以执行以下操作:

    1. 创建二进制字段和文件名:

      mock_pdf = fields.Binary(string='Mock pdf')
      
      mock_pdf_filename = fields.Char(
          string='Mock PDF Filename',
          compute='_compute_mock_pdf_filename'
      )
      
      @api.depends('mock_pdf')
      def _compute_mock_pdf_filename(self):
          self.ensure_one()
          self.mock_pdf_filename = self.name + '.pdf'
      
    2. 然后您可以创建一个按钮来使用方法render_qweb_pdf(或任何其他文件)生成pdf文件。然后在 base64 中编码,以便将内容添加到二进制文件中。在您的情况下,该文件已经在系统中的某个位置。

      @api.multi
      def print_bg_reports(self):
          self.ensure_one()
          ir_actions_report = self.env['ir.actions.report']
      
          report_type = 'qweb-pdf'
          report_name = 'module_name.report_name'
      
          pdf_content = ir_actions_report.search([
              ('report_name', '=', report_name),
              ('report_type', '=', report_type)
          ], limit=1).render_qweb_pdf(self.id)
          self.mock_pdf = base64.encodestring(pdf_content[0])
      
    3. 最后将按钮和二进制字段添加到表单中:

      <field name="mock_pdf_filename" invisible="1" />
      <field name="mock_pdf" filename="mock_pdf_filename" />
      <button name="print_bg_reports" type="object" string="Print reports in background" />
      

    注意:其实我不知道您是如何创建 xlsx 报告的。如果您使用 report_xlsx 模块创建它,您几乎可以执行相同的操作,只需替换报告类型。如果没有,您只需要将本地文件转换为 base64 并将值分配给二进制字段。最后一种选择是在记录中创建一个附件,take a look to this other answer,这是我为了创建它而编写的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2013-03-28
      • 2018-11-13
      • 2011-05-01
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多