
本教程详细讲解如何在odoo自定义模块中,通过在视图中添加按钮,实现用户点击后从服务器下载预设的静态文件(如pdf、xlsx)。文章将涵盖文件存放的最佳实践、按钮方法的实现逻辑,以及如何利用ir.actions.act_url动作类型来触发文件下载,确保操作流程清晰且易于部署。
在Odoo自定义模块开发中,有时需要提供一个功能,允许用户通过点击界面上的按钮来下载存储在服务器上的静态文件,例如操作手册、报告模板或附件。本文将详细指导您如何在Odoo 14社区版(或其他兼容版本)中实现这一功能。
1. 静态文件的存放位置
Odoo模块化的设计要求静态文件(如图片、CSS、JS、文档等)应放置在模块的特定子目录中,以便Odoo能够正确地识别和提供这些资源。对于可供客户端下载的静态文件,推荐将其放置在模块的static目录下。
典型的文件路径结构如下:
your_module_name/
├── __init__.py
├── __manifest__.py
├── models/
│ └── models.py
├── views/
│ └── views.xml
└── static/
└── src/
└── documents/
└── manual.pdf
└── template.xlsx在这个例子中,manual.pdf 和 template.xlsx 是我们希望用户下载的静态文件。src/documents/ 是一个可选的子目录,用于更好地组织文件。
2. 在视图中添加下载按钮
首先,您需要在自定义视图(例如表单视图或列表视图)中添加一个按钮,该按钮将触发文件下载操作。这个按钮通常会调用一个Python方法。
在您的XML视图文件(例如views/views.xml)中,可以这样定义一个按钮:
your.model.form your.model
- name="download_manual_document": 这是将在Python模型中实现的方法名。
- type="object": 表明这个按钮点击后会调用一个Python方法。
- string="下载操作手册": 按钮上显示的文本。
3. 实现下载逻辑:Python方法
接下来,在您的自定义模型(例如models/models.py)中,需要实现与按钮name属性对应的Python方法。这个方法的核心是返回一个特殊字典,该字典指示Odoo执行一个URL重定向动作。
from odoo import models, fields, api
class YourModel(models.Model):
_name = 'your.model'
_description = 'Your Custom Model'
name = fields.Char(string="Name")
# ... 其他字段
def download_manual_document(self):
"""
按钮点击后,触发下载静态文件的方法。
"""
# 构造静态文件的URL路径
# 路径格式为 /your_module_name/static/path/to/your_file.extension
file_url = '/your_module_name/static/src/documents/manual.pdf'
# 返回一个ir.actions.act_url类型的动作
return {
'type': 'ir.actions.act_url', # 指定动作类型为URL重定向
'url': file_url, # 要重定向到的URL,即静态文件的路径
'target': 'self', # 'self'表示在当前窗口/标签页打开,'new'表示在新窗口/标签页打开
}
def download_excel_template(self):
"""
示例:下载另一个静态文件(如XLSX)。
"""
file_url = '/your_module_name/static/src/documents/template.xlsx'
return {
'type': 'ir.actions.act_url',
'url': file_url,
'target': 'new', # 示例在新标签页打开
}关键点解释:
- 'type': 'ir.actions.act_url': 这是Odoo内置的一种动作类型,用于指示客户端浏览器导航到一个指定的URL。
- 'url': file_url: 这是最重要的部分。它指定了静态文件的完整Web路径。Odoo会自动将模块的static目录映射到Web根路径下的/your_module_name/static/。因此,如果您的文件在your_module_name/static/src/documents/manual.pdf,那么对应的URL就是/your_module_name/static/src/documents/manual.pdf。
-
'target': 'self':
- 'self':文件将在当前浏览器窗口或标签页中打开/下载。对于大多数可直接在浏览器中预览的文件(如PDF),浏览器可能会尝试预览而不是直接下载。对于其他文件类型(如XLSX),通常会触发下载。
- 'new':文件将在一个新的浏览器窗口或标签页中打开/下载。这通常是更好的用户体验,因为它不会中断用户在当前Odoo界面上的操作。
4. 示例代码整合
为了更清晰地展示,我们将上述代码片段整合到一起。
your_module_name/__manifest__.py
{
'name': 'Your Custom Module',
'version': '1.0',
'summary': 'A module to demonstrate static file download',
'category': 'Tools',
'depends': ['base'],
'data': [
'security/ir.model.access.csv', # 如果有模型,通常需要访问权限
'views/views.xml',
],
'installable': True,
'application': True,
'auto_install': False,
'license': 'LGPL-3',
}your_module_name/models/models.py
from odoo import models, fields, api
class YourModel(models.Model):
_name = 'your.model'
_description = 'Your Custom Model'
name = fields.Char(string="Name", required=True)
description = fields.Text(string="Description")
def download_manual_document(self):
"""
按钮点击后,触发下载静态文件的方法。
"""
file_url = '/your_module_name/static/src/documents/manual.pdf'
return {
'type': 'ir.actions.act_url',
'url': file_url,
'target': 'new', # 推荐在新标签页打开
}
def download_excel_template(self):
"""
示例:下载另一个静态文件(如XLSX)。
"""
file_url = '/your_module_name/static/src/documents/template.xlsx'
return {
'type': 'ir.actions.act_url',
'url': file_url,
'target': 'new',
}your_module_name/views/views.xml
Your Model your.model tree,form your.model.tree your.model your.model.form your.model
your_module_name/static/src/documents/manual.pdf (一个实际的PDF文件) your_module_name/static/src/documents/template.xlsx (一个实际的XLSX文件)
5. 注意事项与最佳实践
- 文件路径准确性:确保file_url中的模块名、static目录结构以及文件名与实际文件路径完全匹配,包括大小写。
-
模块安装与更新:
- 在首次部署模块时,需要安装或升级模块以使Odoo识别新的视图和模型。
- 如果修改了静态文件路径或添加了新的静态文件,通常不需要强制升级模块,因为Odoo会在运行时直接通过Web服务器访问这些文件。但如果静态文件路径在Python代码或XML视图中被硬编码,并有改动,则需要更新模块以加载这些改动。
- 文件权限:确保Odoo运行的用户对your_module_name/static/目录及其子目录中的文件拥有读取权限,否则Odoo服务器将无法提供这些文件。
- 文件类型兼容性:ir.actions.act_url方法适用于任何可以通过URL直接访问的文件。浏览器对不同文件类型的处理方式可能不同(预览、直接下载)。实践证明,PDF和XLSX文件均能良好工作。
- 用户体验:考虑使用target='new'在新标签页中打开下载链接,以避免用户离开当前Odoo界面。
总结
通过以上步骤,您可以在Odoo自定义模块中轻松实现按钮点击下载静态文件的功能。核心在于将静态文件放置在模块的static目录下,并在按钮对应的Python方法中返回一个ir.actions.act_url类型的字典,指定正确的URL路径。这种方法简洁高效,是Odoo开发中处理静态文件下载的标准实践。










