You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:36:28