场景需求:对多张单据设置一个相同的参数,比如批量审批,批量设值等。
方法一:通过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才能正常打开页面
网友评论