我正在制作一个插件,用于在分号分隔文件中导出发票。我创建了一个向导来选择要导出的发票,我可以在my_module / data / invoices.txt中的文件中写入数据。现在我想下载这个文件,我在web插件中使用了saveas方法,但我最终得到了404错误(我在向导中有一个二进制字段(txt_file
),将文件的内容存储为base64编码数据)。
这是我正在使用的代码:
@api.multi
def export(self):
self.ensure_one()
if self.invoice_ids:
lines = []
for line in self.invoice_ids:
str_line = ''
str_line += str(line.partner_id.name) + ';'
str_line += str(line.number) + ';'
str_line += str(line.origin) + ';'
str_line += str(line.date_invoice) + ';'
str_line += str(line.date_due) + ';'
str_line += line.account_id.name + ';'
str_line += line.journal_id.name + ';'
str_line += str(line.amount_untaxed) + ';'
str_line += str(line.amount_total) + ';'
str_line = str_line.encode('utf-8')
lines.append(str_line)
import os.path
my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/invoices.txt")
file = open(path, 'w+')
if file:
output = ''
for line in lines:
output += line + '\n'
self.txt_file = base64.b64encode(output)
file.write(base64.b64decode(self.txt_file))
wizard = self.env['export_invoice.wizard'].with_context({'active_id': self.id}).create({})
# I have found this on the web
return {
'type': 'ir.actions.act_url',
'url': '/web/binary/saveas?model=export_invoice.wizard&field=txt_file&id=%s&filename_field=invoices.txt' % (
wizard.id),
'target': 'self',
}
答案 0 :(得分:0)
我认为问题可能出在
行wizard = self.env['export_invoice.wizard'].with_context({'active_id': self.id}).create({})
如果想要将指定的上下文添加到向导而不另外修改它,请不要添加.create
,使用空dict调用将创建并返回一个空的向导记录,其中没有内容文件字段,因此是404。
wizard = self.env['export_invoice.wizard'].with_context({'active_id': self.id})
另外,filename_field
GET参数需要包含文件名的模型字段名称,而不是实际的文件名。这不应该破坏下载,但会生成下载文件名,而不是指定的名称。