说真的,太久没有在简书记录内容,最近写odoo,发现有个很正常的需求但是就是找不到解决方案。经过自己一番研究,打算还是分享出来。
背景:需求要求创建一条预览数据,可以不要(则系统不会保存),可以使用(保存到数据库)。
需求上就是需要创建一条待保存的数据,确认没问题系统再保存到数据库。
先上解决方案:
@api.multi
def btn_generate_purchase_order(self):
"""
销售订单 生成 采购订单
:return:
"""
context = dict(self.env.context)
# 窗口处于 编辑 状态
context['form_view_initial_mode'] = 'edit'
context.update({
# 传入 default_ 默认数据
"default_order_line": [(0, 0, {
"name": val.name,
"product_id": val.product_id.id,
"product_qty": val.product_uom_qty,
"product_uom": val.product_uom.id,
"price_unit": val.price_unit,
"taxes_id": [(6, 0, val.tax_id.ids)],
"date_planned": val.create_date,
}) for val in self.order_line],
})
return {
"name": "采购订单",
"view_mode": "form",
"res_model": "purchase.order",
"type": "ir.actions.act_window",
"target": "current",
"context": context
}
只要玩过odoo应该都很熟悉上面的逻辑。
是的,实际上我查了odoo的源码,打开调试模式看了odoo并不支持用上下文传递newid这样的对象,res_id只能接受一个int型的对象id。
那么重点来了,要实现这样的效果,应该支持以下三个条件:
- 返回一个编辑模式的form视图,form_view_initial_mode: edit可以满足;
- 数据未保存到数据库,只要不传res_id即可满足;
- 界面应该有初始数据,提供用户进行确认,default_可以支持返回默认数据。
所以思路就是造一套默认数据返回,并且打开编辑模式,去掉res_id这个数值就能满足效果: