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

Odoo 14社区版:自定义模块按钮触发静态文件下载实现方法

Odoo 14 静态PDF文件下载实现方案

一、静态PDF文件的存放位置

在你的自定义模块目录下,创建static文件夹(Odoo规范的静态资源目录),再在其中创建子目录(比如documents或pdfs)来存放PDF文件。最终路径示例:

my_custom_module/
├── static/
│   └── documents/
│       └── user_manual.pdf

这种结构符合Odoo模块化架构规范,方便模块迁移、备份和维护,Odoo会自动识别static目录下的资源文件。

二、下载功能实现(基于已创建的按钮及方法)

在自定义模型的方法中,通过Odoo的HTTP工具类构造文件下载响应,代码示例如下:

from odoo import models, http
import os

class MyCustomModel(models.Model):
    _name = 'my.custom.model'  # 替换为你的自定义模型名称
    # 其他模型定义代码...

    def action_download_manual(self):
        # 定义模块名和PDF文件名
        module_name = 'my_custom_module'  # 替换为你的模块名
        pdf_filename = 'user_manual.pdf'
        
        # 获取模块绝对路径,优先从addons_manifest读取, fallback到默认addons目录
        module_path = http.addons_manifest.get(module_name, {}).get('addons_path')
        if not module_path:
            module_path = os.path.join(http.root_path, 'addons', module_name)
        
        # 拼接PDF文件完整路径
        pdf_file_path = os.path.join(module_path, 'static', 'documents', pdf_filename)
        
        # 校验文件是否存在,避免报错
        if not os.path.exists(pdf_file_path):
            raise ValueError("指定的PDF文件不存在")
        
        # 读取PDF文件内容
        with open(pdf_file_path, 'rb') as pdf_file:
            pdf_content = pdf_file.read()
        
        # 设置响应头,触发浏览器下载行为
        response_headers = {
            'Content-Type': 'application/pdf',
            'Content-Disposition': f'attachment; filename="{pdf_filename}"'
        }
        
        # 返回下载响应
        return http.request.make_response(pdf_content, headers=response_headers)

三、注意事项

  • 权限控制:可通过模型的groups_id属性,或在视图按钮中设置groups属性,限制只有指定权限组的用户能触发下载操作。
  • 中文文件名处理:如果文件名包含中文,确保响应头中的filename编码正确,可使用urllib.parse.quote对文件名进行编码,避免浏览器显示乱码。
  • 文件更新:后续更新PDF文件时,直接替换对应路径下的文件即可,无需修改代码。

内容的提问来源于stack exchange,提问作者holydragon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:25:01