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
相关产品推荐
相关产品推荐

