Odoo透视图中添加自定义按钮执行后台方法
在Odoo开发中,我们经常需要在标准视图上添加自定义功能按钮。本文将演示如何在Pivot透视图中添加一个"数据刷新"按钮,点击后执行后台Python方法并刷新页面。
实现原理
通过扩展标准Pivot视图,添加自定义按钮并绑定点击事件,调用后台模型的Python方法。
实现步骤
1. 创建XML模板添加按钮
首先在custom_pivot_view.xml
中扩展标准Pivot视图的按钮区域:
<?xml version="1.0" encoding="UTF-8"?>
<templates id="custom_pivot_template" xml:space="preserve">
<t t-extend="PivotView.buttons">
<t t-jquery="div.btn-group-sm:has(button.o_pivot_download)" t-operation="after">
<div class="btn-group btn-group-sm" style="margin-left: 5px;">
<button class="btn btn-primary btn_refresh_data" type="button">
数据刷新
</button>
</div>
</t>
</t>
</templates>
2. 编写JavaScript处理按钮逻辑
在 custom_pivot_view.js 中处理按钮的显示逻辑和点击事件:
odoo.define('custom_module.pivot_button', function (require) {
"use strict";
var PivotView = require('web.PivotView');
var Model = require('web.Model');
PivotView.include({
render_buttons: function ($node) {
this._super($node);
var currentModel = this.model;
if (currentModel === 'report.sales.analysis') {
this.$buttons.find('.btn_refresh_data').on('click', function () {
var reportModel = new Model('report.sales.analysis');
reportModel.call('refresh_report_data', [{}]).then(function () {
location.reload();
}).fail(function (error) {
console.error('刷新失败:', error);
});
});
} else {
this.$buttons.find('.btn_refresh_data').hide();
}
}
});
});
3. 添加CSS样式(可选)
在 custom_pivot_view.css 中添加按钮样式:
.o_pivot_view .btn_refresh_data {
margin-right: 8px;
}
4. 后台Python方法实现
在对应的模型中添加处理方法:
from odoo import models, api
class SalesAnalysisReport(models.Model):
_name = 'report.sales.analysis'
@api.model
def refresh_report_data(self, args):
"""刷新报表数据"""
# 这里实现数据刷新逻辑
self.env.cr.execute("""
-- 更新数据的SQL语句
""")
return True
5. 注册前端资源
在 manifest.py 中注册前端资源:
{
'name': '自定义透视表功能',
'data': [
'views/assets.xml',
],
# 其他manifest配置...
}
实现效果
- 在销售分析透视图中会出现"数据刷新"按钮
- 点击按钮会调用后台 refresh_report_data 方法
- 方法执行完成后自动刷新页面
- 在其他透视图中该按钮会自动隐藏
注意事项
- 确保前端JS中模型名称与后台Python模型名称一致
- 按钮权限控制需要在Python方法中实现
- 长时间运行的操作应考虑使用队列处理
通过这种方式,我们可以灵活地为Odoo标准视图添加各种自定义功能,满足业务需求。