odoo Binary field 下载后文件名的问题

版本:

odoo8

问题描述:

在model中添加二进制字段

file = fields.Binary(string="File Attachment")

在视图中显示后,点击会自动下载,但是下载后文件的名字却不是上传时候的文件名,而是模块名加数字的形式。

而正常情况是,上传时候文件叫啥,下载之后还应该叫这个名字。


分析过程:

点击“Download”,是发送了一个url,到web的控制器saveas_ajax,位置在addons/web/controllers/main.py的1111行。

断点跟踪会发现传过来的参数data中取不到filename_field

其实在这里做点改动也是可以的。

但是实际上解决办法跟这个过程没啥关系。

解决办法:

在定义附件字段时,多加一个文件名字的字段

    file = fields.Binary(string="File Attachment")
    file_name = fields.Char(string="File Name")

然后在视图文件中这样定义

    <field name="file" filename="file_name"/>
    <field name="file_name" invisible="1"/>
重启odoo并更新模块,重新上传附件就可以看到效果了。
<think>嗯,用户想在Odoo中实现将发票模板导出并保存为附件的功能。首先,我需要理解用户的需求。他们可能希望生成发票后,自动或手动将特定模板格式的发票导出为文件,并作为附件关联到相应的记录上,比如销售订单或发票本身。这样方便后续的管理和查看。 接下来,我需要回忆Odoo中处理发票和附件的相关模块。Odoo的发票功能主要在account模块中,附件系统则是使用ir.attachment模型。所以,可能需要继承或扩展这些模块的模型和方法。 然后,考虑实现方式。用户提到的是导出模板,这可能涉及到QWeb报表的设计,因为Odoo通常使用QWeb来生成PDF等格式的报表。所以,首先需要确认是否存在现有的报表,或者是否需要自定义一个特定的发票模板。如果现有的发票模板不符合需求,用户可能需要自定义一个QWeb模板,然后在代码中调用这个模板生成PDF。 接着,生成PDF后如何保存为附件Odoo附件是通过ir.attachment模型处理的,每个附件需要关联到具体的记录。因此,在生成PDF内容后,需要创建一个ir.attachment的记录,将PDF内容作为二进制数据存储,并设置相关的res_model和res_id字段,以关联到对应的发票或销售订单。 可能需要覆盖发票打印的方法,比如在打印发票时,除了返回PDF的响应外,同时将生成的PDF保存为附件。或者,添加一个按钮,手动触发导出和保存附件的操作。 还要考虑权限问题,确保用户有权限创建附件,并且附件正确关联到相应的记录。另外,处理文件名问题,可能需要动态生成文件名,比如基于发票编号和日期。 代码方面,可能需要创建一个新的方法,例如在account.move模型中添加一个action_export_as_attachment方法。这个方法中,使用render_qweb_pdf来生成PDF的二进制数据,然后创建ir.attachment记录。同时,需要在XML中为发票表单视图添加一个按钮,调用这个方法。 测试时需要注意,是否所有类型的发票都能正确生成附件附件的内容是否正确,以及权限设置是否恰当。如果有错误处理,比如生成PDF失败时如何提示用户,也需要考虑进去。 另外,用户提供的引用中提到了一些发票相关的改进,比如SEPA支付的二维码和配置布局向导的改进,可能需要参考这些现有的功能,确保新的导出附件功能不会冲突,或者利用已有的改进来优化用户体验。 最后,可能需要编写自定义模块来实现这些功能,确保代码符合Odoo的开发规范,比如正确使用API装饰器,模型继承方式,以及视图的扩展方法。</think>在Odoo中实现发票模板导出为附件的功能,可通过以下步骤实现: ### 一、创建自定义QWeb报表模板 1. 在模块目录新建`report/custom_invoice_template.xml` 2. 继承标准发票模板: ```xml <template id="custom_invoice_report" inherit_id="account.report_invoice_document"> <xpath expr="//div[@class='page']" position="replace"> <!-- 自定义模板内容 --> <t t-call="web.html_container"> <!-- 添加SEPA二维码区块(引用[1]功能) --> <div class="qrcode_section" t-if="o.payment_qr"> <img t-att-src="o.payment_qr"/> </div> </t> </xpath> </template> ``` ### 二、实现PDF生成与附件关联 ```python from odoo import models, api, fields class AccountMove(models.Model): _inherit = 'account.move' def action_export_as_attachment(self): # 生成PDF内容(引用[3]的报表改进功能) pdf_content, _ = self.env['ir.actions.report'].sudo()._render_qweb_pdf( 'account.report_invoice', self.ids ) # 创建附件记录 self.env['ir.attachment'].create({ 'name': f'发票_{self.name}.pdf', 'type': 'binary', 'datas': base64.b64encode(pdf_content), 'res_model': self._name, 'res_id': self.id, 'mimetype': 'application/pdf' }) return {'type': 'ir.actions.act_window_close'} ``` ### 三、添加界面操作按钮 在`views/account_move_views.xml`中添加: ```xml <record id="view_move_form" model="ir.ui.view"> <field name="inherit_id" ref="account.view_move_form"/> <field name="arch" type="xml"> <xpath expr="//button[@name='action_post']" position="after"> <button name="action_export_as_attachment" string="导出为附件" type="object" class="btn-primary"/> </xpath> </field> </record> ``` ### 四、配置注意事项 1. 确保启用了"文档管理"功能(引用[2]的票务管理改进) 2. 在`__manifest__.py`中声明报表和视图文件 3. 用户权限需要包含: - 发票的读取权限 - 附件的创建权限 - 报表的生成权限 ### 五、功能验证 1. 打开已确认的发票单据 2. 点击"导出为附件"按钮 3. 在聊天窗口查看生成的附件(引用[1]的预览改进) 4. 检查文件内容是否包含二维码(SEPA支付支持)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值