前言

我们通常在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. xenomai内核解析之信号signal(一)---Linux信号机制

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1. Linux信号 1.1注册信号处理函数 ...

  2. vs coed的使用(二) 如何运行cpp文件(不用插件比如code runner)

    一.前提 1.配置好编译运行的环境,比如系统变量.vs code的settings.json 2.检查配置好的环境没有问题 我配置结果 [环境变量] [系统变量] 确定settings.json里面的 ...

  3. [spring] -- 设计模式篇

    工厂模式 Spring使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象. BeanFactory :延迟注入(使用到某个 bean 的时候才 ...

  4. python爬虫入门(5)----- 阿里巴巴供应商爬虫

    阿里巴巴供应商爬虫# 起因## 学了爬虫入门之后,打算找一个有难度的网站来实践,一开始打算找淘宝或者天猫(业界老大)来实践,但后续发现网上已经有很多这方面的项目,于是瞄上了阿里的国际网站阿里巴巴.开始 ...

  5. Markdown画图(mermaid)学习

    简介 目前博客园支持mermaid的graph,subgraph,sequenceDiagram,gantt,classDiagram mermaid(美人鱼), 是一个类似markdown,用文本语 ...

  6. JS 原生ajax写法

    <script> //step1.创建XMLHTTPRequest对象,对于低版本的IE,需要换一个ActiveXObject对象 var xhr; if (window.XMLHttpR ...

  7. Spring+hibernate无法执行更新操作

    如果你幸运的使用springmvc+hibernate你应该检查以下springmvc的扫面范围是否是和spring framework的事务范围有冲突,虽然是公用容器,但是事务这块却不能公用的,sp ...

  8. vector 赋初始值的问题

    这个,输出为1 这个,啥都输不出来. 据说是因为没有初始化. 其实我搜了一下 vector<vector<int> > A;//正确的定义方式 vector<vector ...

  9. SQLyog无操作一段时间后重新操作会卡死问题(解决办法)

    这种是因为一段时间不操作后,服务器将空闲连接丢弃了,而客户端(sqlyog)不知道,导致长时间无响应,而超时之后,sqlyog 使用了新的连接,所以又可以顺畅操作了. 将会话空闲时间默认改为自定义,填 ...

  10. 11-Pandas之排序(df.sort_index()、df.sort_values()、随机重排、随机采样)

    排序是一种索引机制的一种常见的操作方法,也是Pandas重要的内置运算,主要包括以下3种方法: 排序方法 说明 sort_values() 根据某一列的值进行排序 sort_index() 根据索引进 ...