odoo中有很多地方使用到了向导,实际上是通过一个瞬态模型作为中间模型处理数据,来达到某些模型上不好直接处理的数据
向导的流程:
定义瞬态模型的模型和视图 -> 定义一个动作以及动作对应的方法打开瞬态模型的form视图 -> 定义瞬态模型form视图底部按钮 -> 瞬态模型中处理数据
示例步骤如下: 注意:新定义的模型需要在权限文件ir.model.access.csv中注册,新定义的视图如果是单独文件,需要在__manifest__.py中引入
1. 创建瞬态模型
from odoo import models, fields, api, exceptions
class 瞬态模型类名(models.TransientModel):
'''
瞬态模型
'''
_name = '瞬态模型名称'
字段1 = 字段定义
字段2 = 字段定义
def 瞬态模型form视图底部按钮方法(self):
处理逻辑
2. 定义瞬态模型的form视图
<odoo>
<data>
<record model="ir.ui.view" id="视图id">
<field name="name">视图名称</field>
<field name="model">瞬态模型名称</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="字段1"/>
<field name="字段2"/>
</group>
</sheet>
<footer>
<button class="btn btn-primary" type="object" name="对应瞬态模型定义的底部按钮方法" text="底部按钮"/>
<button class="btn btn-secondary" text="取消" special="cancel" />
</footer>
</form>
</field>
</record>
</data>
</odoo>
3. 在需要定义向导的模型视图中定义一个动作,关联到需要向导的模型
<record id="动作id" model="ir.actions.server">
<field name="name">动作名称</field>
<field name="model_id" ref="需要向导的模型model_xx_xxx_xx"/>
<field name="binding_model_id" ref="需要向导的模型model_xx_xxx_xx"/>
<field name="state">code</field>
<field name="is_button">False</field>
<field name="code">
if records:
action = model.需要向导的模型定义的打开向导视图方法function_xxx(env.context.get("active_ids"))
</field>
</record>
4. 定义需要向导的模型的python方法,来打开瞬态模型的视图
@api.multi
def function_xxx(self, ids):
'''
打开瞬态模型视图
'''
form_id = self.env.ref('瞬态模型所在模块的文件名.瞬态模型form视图id').id
return {
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "瞬态模型名称_name属性",
"name": "action名称",
"target": "new", # 打开视图方式new是弹窗方式(推荐)
"mode": 'edit', # 打开视图的初始模式edit是编辑模式
"views": [[form_id, "form"]],
"context": {'default_字段1': [[6, 0, ids]]} #可以通过这种字段默认值的方式将选中的记录id传递到瞬态模型,也可以通过context中自定义其他属性传递 比如"context": {'ids': ids} 瞬态模型中可以通过self._context['ids']获取
}