前言

我们通常在form视图中可以很简单地在header里面添加按钮,但是在某些情况下,我们也需要在Tree视图中添加按钮,但是odoo官方目前没有给我们提供相应的接口,因此,我们尝试自己来实现它。最终效果如下:

按钮显示拓展

首先,我们需要先把按钮的样子给它做出来,我们需要在项目路径下(/xxx/static/src/xml/file_name.xml)添加如下模板:

 <?xml version="1.0" encoding="UTF-8"?>
<template xml:space="preserve">
<t t-extend="ListView.buttons">
<t t-jquery="button.o_list_button_add" t-operation="after">
<button class="btn btn-primary oe_action_button_picking o_hidden" type="button"
accesskey="f">拣货</button>
</t>
</t>
9 </template>

继承修改ListView视图的buttons,添加“拣货”按钮,然后在__manifest__的'qweb'中引用它,升级模块后发现所有模块下都已经成功添加按钮。

通常情况下,我们只需要在特定的模块下显示按钮,我们只需要稍作修改,指定模型名即可:

 <?xml version="1.0" encoding="UTF-8"?>
<template xml:space="preserve">
<t t-extend="ListView.buttons">
<t t-jquery="button.o_list_button_add" t-operation="after">
<button t-if="widget.modelName == 'MODEL_NAME'"
class="btn btn-primary oe_action_button_picking o_hidden" type="button"
accesskey="f">拣货</button>
</t>
</t>
</template>

按钮方法逻辑

我们简单完成了按钮的显示,按钮的目的就是需要绑定执行特定的方法,因此,我们接下来需要为按钮绑定对应的python方法。

首先在目录下(/static/src/js/file_name.js)创建一个js文件,继承修改ListController:

 odoo.define('ModelName.action_picking_button', function (require) {
"use strict";
var core = require('web.core');
var ListController = require('web.ListController');
var rpc = require('web.rpc');
var session = require('web.session');
var _t = core._t;
ListController.include({
renderButtons: function ($node) {
this._super.apply(this, arguments);
if (this.$buttons) {
this.$picking_button = this.$buttons.find('.oe_action_button_picking');
this.$picking_button.click(this.proxy('action_def'));
}
},
action_def: function () {
var self = this;
var user = session.uid;
rpc.query({
model: 'ModelName',
method: 'do_picking',
args: [[user], self.getSelectedIds()],
}).then(function (result) {
self.do_notify('拣货通知', '销售订单(%s)已成功生成拣货单,你可以开始拣货啦' % result.codes);
self.update({});
});
}
});
});

注意上面的oe_action_button_picking 需要和上面qweb templates中的button class对应,以绑定方法。

action_def 方法就是button绑定的方法,在方法中调用了model类中的do_picking方法。

因此,我们只需要在python类中添加do_picking方法,并添加相应的逻辑即可。

拓展彩蛋

我需要有相应行选定的时候显示按钮,没有的时候隐藏,如下图。该如何实现呢?

在JS中覆盖_toggleSidebar方法,在selectedRecords大于0时显示按钮,如下逻辑:

_toggleSidebar: function () {
this._super.apply(this, arguments);
if (this.$picking_button) {
this.do_picking_button_toggle(this.selectedRecords.length > 0);
}
},
do_picking_button_toggle: function (display) {
if (_.isBoolean(display)) {
display ? this.do_show_picking_button() : this.do_hide_picking_button();
} else {
this.$el.hasClass('o_hidden') ? this.do_show_picking_button() : this.do_hide_picking_button();
}
},
do_show_picking_button: function() {
this.$picking_button.removeClass('o_hidden');
},
do_hide_picking_button: function() {
this.$picking_button.addClass('o_hidden');
}

当然,你也可以见仁见智,修改不同的逻辑以满足你的业务。

odoo12 Tree视图创建编辑旁边新增按钮,并根据条件隐藏的更多相关文章

  1. openerp学习笔记 tree视图增加复选处理按钮

    wizard:用于确认或选择 wizard/sale_multi_action.py # -*- encoding: utf-8 -*-from openerp.osv import fields, ...

  2. Odoo13之在tree视图左上角添加自定义按钮

    前言 首先展示效果图,如下图所示,在资产设备模块tree视图的左上角添加了一个同步资产的按钮. 要完成按钮的添加,分为四步,分别是: 1.编写xml文件,找到相关模型tree视图,并给模型tree视图 ...

  3. openerp学习笔记 视图(tree\form)中隐藏按钮( 创建、编辑、删除 ),tree视图中启用编辑

    视图(tree\form)中隐藏按钮( 创建.编辑.删除 )create="false" edit="false" delete="false&quo ...

  4. Odoo4 tree视图左上角新增Button

    # 一.直接在tree根元素中新增.这种有个限制就是必须要勾选一或多条记录的时候按钮才会显示 <tree> <header> <button type="obj ...

  5. Odoo 配置快速创建编辑按钮

    对于Man2one类型的数据,我们知道,form view中总会显示出一个尾巴似的"create and edit"和一个快速创建的机制,有时候业务人员一不小心就容易创建一个新的行 ...

  6. ASP.NET MVC4 新手入门教程之六 ---6.编辑视图与编辑方法

    在本节中,您会为电影控制器检查生成的操作方法和视图.然后,您将添加一个自定义的搜索页面. 运行该应用程序,然后浏览到Movies控制器通过将/Movies追加到您的浏览器的地址栏中的 URL.将鼠标指 ...

  7. ASP.NET MVC 音乐商店 - 5. 通过支架创建编辑表单

    在上一章,我们已经从数据库获取数据,然后显示出来,这一章,我们将允许编辑数据. 创建 StoreManagerController 控制器 我们将要创建称为 StoreManager 的控制器,对于这 ...

  8. Make a List View Editable 使列表视图可编辑

    In this lesson, you will learn how to make a List View editable. For this purpose, the DemoTask List ...

  9. Odoo 二次开发教程(三)-第一个Model及Form、Tree视图

    创建完我们的模块,接下来我们就要为我们的模块添加一些对象.今天我们将要创建一个学生对象(tech.student)和一些基本的属性,并将用form和tree视图将其展示出来: 一. 创建tech.st ...

随机推荐

  1. 设计模式:Iterator模式

    目的:将数据的存储和数据的查询分开,降低数据的耦合性 继承关系图: 例子: //定义迭代器接口 template<typename T> class Iterator { public: ...

  2. ThreadLocal源码分析以及why导致内存泄露

    1 ThreadLocal? This class provides thread-local variables. These variables differ from their normal ...

  3. 如何消灭飞机的“黑色十分钟”,AI来帮忙

    近年来,“AI的应用和落地”逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的“化学反应”.例如,在日常生活中,AI可以推送我们喜欢的新闻或视频,可以在拍照的时候识别场景提升照片的美感 ...

  4. Dom运用1

    1.简单计算器 <!-- 第一个数--> <input type="text"> <!-- 符号复选框--> <select name=& ...

  5. 在同一form表单中如何提交两个不同的action

    摘自:CSDN博客 原文链接地址:http://blog.csdn.net/huazhangena/article/details/7903955 有两种办法可以实现:1.针对一个action有多个提 ...

  6. this指向面试题两则

    面试题1 let len = 10; function fn() { console.info(this.len) } fn(); // A let Person = { len: 5, say: f ...

  7. 无法安装 VMware Tools。尝试访问安装 VMware Tools 所需的图像文件“/usr/lib/vmware/isoimages/linuxPreGlibc25.iso”时出错: 2 (No such file or directory)。请参考产品文档或知识库文章 2129825,了解关于如何获取该客户机操作系统的 VMware Tools 软件包的详细信息。

    无法安装 VMware Tools.尝试访问安装 VMware Tools 所需的图像文件"/usr/lib/vmware/isoimages/linuxPreGlibc25.iso&quo ...

  8. mysql中走与不走索引的情况汇集(待全量实验)

    说明 在MySQL中,并不是你建立了索引,并且你在SQL中使用到了该列,MySQL就肯定会使用到那些索引的,有一些情况很可能在你不知不觉中,你就“成功的避开了”MySQL的所有索引. 索引列参与计算 ...

  9. luogu P5892 [IOI2014]holiday 假期 决策单调性优化dp 主席树

    LINK:holiday 考虑第一个subtask. 容易想到n^2暴力枚举之后再暴力计算答案. 第二个subtask 暴力枚举终点可以利用主席树快速统计答案. 第三个subtask 暴力枚举两端利用 ...

  10. 前端面试基础题:Ajax原理

    Ajax 的原理简单来说是在⽤户和服务器之间加了—个中间层( AJAX 引擎),通过XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据,然后⽤ javascrip t 来操作 D ...