工作生活

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

2019-06-30  本文已影响0人  grey_27

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

方法一:通过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
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>
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才能正常打开页面

上一篇 下一篇

猜你喜欢

热点阅读