Odoo中ir.actions.act_url动作未正常运行如何解决
问题根因
服务端动作的XML配置中,code字段仅调用了模型方法,未将方法返回的ir.actions.act_url动作字典返回给Odoo动作调度器,调度器接收不到动作指令自然不会触发跳转,这是无响应的核心原因。
另外需要同步确认自定义路由的注册权限、返回逻辑是否符合要求,避免路由侧报错导致无响应。
修复方案
1. 修改XML服务端动作代码
将方法调用的返回值透传return给调度器,修改后code字段内容如下:
<field name="code"> if records: res = records.obtener_todos_los_adjuntos_en_un_zip() if res: return res </field>
2. 优化模型层Python方法
原有循环收集ID的逻辑可以直接用Odoo模型自带的self.ids属性简化,优化后代码:
def obtener_todos_los_adjuntos_en_un_zip(self): if not self.ids: return False base_url = self.env['ir.config_parameter'].get_param('web.base.url') url = f'{base_url}/web/binary/descargar_adjuntos?ids={"-".join(map(str, self.ids))}' return { "type": "ir.actions.act_url", "url": url, "target": "new", }
3. 校验自定义路由逻辑
确保/web/binary/descargar_adjuntos路由已正确注册,且配置了用户鉴权避免权限拦截,参考路由实现:
from odoo import http from odoo.http import request, Response import zipfile, base64 from io import BytesIO class AttachmentDownload(http.Controller): @http.route('/web/binary/descargar_adjuntos', type='http', auth='user', csrf=False) def download_attach_zip(self, ids, **kwargs): # 解析传入的账单ID invoice_ids = [int(i) for i in ids.split('-') if i.isdigit()] if not invoice_ids: return Response("未选中有效单据", status=400) # 打包附件为ZIP zip_buffer = BytesIO() with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: invoices = request.env['account.move'].browse(invoice_ids) for inv in invoices: # 遍历单据关联的所有附件写入压缩包 all_attach = inv.message_main_attachment_id | inv.attachment_ids for attach in all_attach: if attach.datas: zf.writestr(attach.name, base64.b64decode(attach.datas)) zip_buffer.seek(0) # 返回下载响应 resp = Response(zip_buffer, content_type='application/zip') resp.headers['Content-Disposition'] = 'attachment; filename="adjuntos_facturas.zip"' return resp
验证方式
修改完成后升级对应自定义模块,刷新浏览器清除缓存,选中对应账单记录点击「Descargar todos los adjuntos」动作,即可自动新开标签页触发ZIP包下载。
内容的提问来源于stack exchange,提问作者Legna
相关产品推荐
相关产品推荐

