Odoo自定义模块中实现按钮点击下载静态文件教程

花韻仙語
发布: 2025-10-13 13:51:10
原创
303人浏览过

Odoo自定义模块中实现按钮点击下载静态文件教程

本教程详细讲解如何在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)中,可以这样定义一个按钮:

<record id="view_your_model_form" model="ir.ui.view">
    <field name="name">your.model.form</field>
    <field name="model">your.model</field>
    <field name="arch" type="xml">
        <form string="Your Model">
            <header>
                <!-- 其他按钮或状态字段 -->
                <button name="download_manual_document" type="object" string="下载操作手册" class="oe_highlight"/>
            </header>
            <sheet>
                <!-- 模型字段定义 -->
            </sheet>
        </form>
    </field>
</record>
登录后复制
  • name="download_manual_document": 这是将在Python模型中实现的方法名。
  • type="object": 表明这个按钮点击后会调用一个Python方法。
  • string="下载操作手册": 按钮上显示的文本。

3. 实现下载逻辑:Python方法

接下来,在您的自定义模型(例如models/models.py)中,需要实现与按钮name属性对应的Python方法。这个方法的核心是返回一个特殊字典,该字典指示Odoo执行一个URL重定向动作。

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中 22
查看详情 百度文心百中
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

<odoo>
    <!-- 菜单项,用于访问您的模型 -->
    <menuitem id="menu_your_model_root" name="文件下载示例" sequence="10"/>
    <menuitem id="menu_your_model_action" parent="menu_your_model_root"
              name="管理文件" action="action_your_model"/>

    <!-- 动作定义 -->
    <record id="action_your_model" model="ir.actions.act_window">
        <field name="name">Your Model</field>
        <field name="res_model">your.model</field>
        <field name="view_mode">tree,form</field>
    </record>

    <!-- 树视图 -->
    <record id="view_your_model_tree" model="ir.ui.view">
        <field name="name">your.model.tree</field>
        <field name="model">your.model</field>
        <field name="arch" type="xml">
            <tree string="Your Model">
                <field name="name"/>
                <field name="description"/>
            </tree>
        </field>
    </record>

    <!-- 表单视图 -->
    <record id="view_your_model_form" model="ir.ui.view">
        <field name="name">your.model.form</field>
        <field name="model">your.model</field>
        <field name="arch" type="xml">
            <form string="Your Model">
                <header>
                    <button name="download_manual_document" type="object" string="下载操作手册 (PDF)" class="oe_highlight"/>
                    <button name="download_excel_template" type="object" string="下载模板 (XLSX)" class="oe_link"/>
                </header>
                <sheet>
                    <group>
                        <field name="name"/>
                        <field name="description"/>
                    </group>
                </sheet>
            </form>
        </field>
    </record>
</odoo>
登录后复制

your_module_name/static/src/documents/manual.pdf (一个实际的PDF文件) your_module_name/static/src/documents/template.xlsx (一个实际的XLSX文件)

5. 注意事项与最佳实践

  1. 文件路径准确性:确保file_url中的模块名、static目录结构以及文件名与实际文件路径完全匹配,包括大小写。
  2. 模块安装与更新
    • 在首次部署模块时,需要安装或升级模块以使Odoo识别新的视图和模型。
    • 如果修改了静态文件路径或添加了新的静态文件,通常不需要强制升级模块,因为Odoo会在运行时直接通过Web服务器访问这些文件。但如果静态文件路径在Python代码或XML视图中被硬编码,并有改动,则需要更新模块以加载这些改动。
  3. 文件权限:确保Odoo运行的用户对your_module_name/static/目录及其子目录中的文件拥有读取权限,否则Odoo服务器将无法提供这些文件。
  4. 文件类型兼容性:ir.actions.act_url方法适用于任何可以通过URL直接访问的文件。浏览器对不同文件类型的处理方式可能不同(预览、直接下载)。实践证明,PDF和XLSX文件均能良好工作。
  5. 用户体验:考虑使用target='new'在新标签页中打开下载链接,以避免用户离开当前Odoo界面。

总结

通过以上步骤,您可以在Odoo自定义模块中轻松实现按钮点击下载静态文件的功能。核心在于将静态文件放置在模块的static目录下,并在按钮对应的Python方法中返回一个ir.actions.act_url类型的字典,指定正确的URL路径。这种方法简洁高效,是Odoo开发中处理静态文件下载的标准实践。

以上就是Odoo自定义模块中实现按钮点击下载静态文件教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号