美文网首页工作生活
odoo前端页面对多条记录进行操作的方法

odoo前端页面对多条记录进行操作的方法

作者: grey_27 | 来源:发表于2019-06-30 16:30 被阅读0次

场景需求:对多张单据设置一个相同的参数,比如批量审批,批量设值等。

方法一:通过action.client跳转一个wizard视图,在向导视图中对数据操作

  • 创建动作按钮
<act_window id="approve_multi_sell_order_action"
            name='批量确认销售订单'
            <!--需要调用的模型--> 
            res_model="approve.multi.sell.order"
            <!--所在模型--> 
            src_model="sell.order"
            <!--允许多条记录,个人觉得这里是隐式将window.action改为了client.action-->
            multi="True"
            view_type="form"
            view_mode="form"
            target="new"
            />

以上代码实现创建在动作下拉菜单中显示按钮,窗口动作是不会出现在下拉菜单中的 ,只有加了multi="True"转为客户端动作才能显示按钮


image.png
  • 向导模型
    创建模型可以按自己需求进行开发,重点在于如何获取在前端勾选的记录id
context = self.env.context
order_names = [order.name for order in self.browse(context.get('active_ids'))]

其实勾选记录即是active_ids字段,他被放入了上下文记录中,可以重写create方法,或者字段加上计算方法来将获取出记录使得打开向导视图时直观看到记录

如果还需要对记录进行过滤可以重写向导的fields_view_get方法,实现报错,该方法在打开模型之前调用,可以实现错误的记录直接报错而不进入向导

@api.model
    def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
        """ 根据内容判断 报出错误 """
        res = super(ApproveMultiSellOrder, self).fields_view_get(view_id, view_type, toolbar=toolbar, submenu=False)
        orders = self.env['sell.order'].browse(self.env.context.get('active_ids'))
        done_lists = ''
        for order in orders:
            if order.state == 'done':
                done_lists += order.name
        if done_lists:
            raise UserError(u'销货订单 ' + done_lists + u' 已确认!')
        return res

方法二: 通过actions.server直接调用python方法实现批量操作

  • 服务端动作
# actions.server
<record id="test_server_action" model="ir.actions.server">
    <field name="name">测试按钮2</field>
    <!--调用方法的模型,一般格式是model_+模型名-->
    <field name="model_id" ref="model_test_model"/>
    <field name="state">code</field>
    <!--记住在方法前加records.-->
    <field name="code">records.funcname()</field>
</record>
  • 绑定动作
    服务器动作也不会显示在动作下拉菜单中,需要我们绑定一个客户端动作
<record id="run_test_server_action" model="ir.values">
    <field name="name">run.test.server.action</field>
    <field name="key2">client_action_multi</field>
    <field name="key">action</field>
    <field name="model">test.model</field>
    <!--注意格式只要将ref里的值改为服务器动作的id-->
    <field name="value" eval="'ir.actions.server,' + str(ref('test_server_action'))" />
</record>
  • 在模型中定义方法
    重点一样是取出active_ids获得勾选记录的id,之后就按需开发
def funcname(self):
    context = self.env.context
    orders = [order for order in self.browse(context.get('active_ids'))]
    ....

更新

方法二中如果你的代码执行完后需要打开另一个展示视图,你会发现无法跳转,这时你需要对ir.actions.server进行修改,将<field name="code">records.funcname()</field>
改为
<field name="code">action=records.funcname()</field>
这样你在def funcname()中定义return action才能正常打开页面

相关文章

  • odoo前端页面对多条记录进行操作的方法

    场景需求:对多张单据设置一个相同的参数,比如批量审批,批量设值等。 方法一:通过action.client跳转一个...

  • Odoo 12开发者指南

    Odoo 12开发者指南Odoo Appsodoo前端jsubuntu安装odoo12(1)ubuntu安装odo...

  • odoo 通过按钮访问路由

    odoo通过按钮进行访问路由,完成某些操作 制作不易,点赞鼓励哈

  • 多条件的批量操作

    通常在sql语句中需要多条记录同时进行删除、修改、查询,如果操作的记录有一个唯一确定的主键,那么通过primary...

  • 落地页的概念

    落地页:指在页面的一些操作结束后,需要一个新页面对操作进行结果展示,此时称这个新页面为落地页。

  • odoo ORM研究3 - odoo fields常用的字段属性

    之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的...

  • 数据埋点之四:埋点事件触发类型

    前端触发上报用户在前端进行相应的操作时,即触发采集数据事件。 前端获取后端结果上报这种方式,一般同由于除了记录用户...

  • Innodb缓冲池

    前言 Inoodb存储引擎是以页为单位从磁盘上读取记录到内存的,一个页大小为16KB,通常包含多条记录,可以很好的...

  • 管理端审核流程需要考虑

    1、申请操作 选择单条数据; 选择多条数据; 选择不可操作的数据(本系统的状态或者关联其他系统的状态)时,前端提示...

  • 前端跨域请求方法总结

    在微信公众号前端大全上看到一篇文章 - 前端跨域请求原理及实践,跟着里面的方法进行了一些操作,在这里进行总结并加入...

网友评论

    本文标题:odoo前端页面对多条记录进行操作的方法

    本文链接:https://www.haomeiwen.com/subject/kijbcctx.html