第二十四章 向导(Wizard)
篇别:第三篇 数据库与数据管理
本章学习目标
- 能使用
TransientModel设计 单步/多步向导 与 批量操作入口。 - 掌握
default_get、context(active_ids) 预填与 返回值ir.actions.*。 - 能处理 双击提交、重复打开 等 幂等 问题。
- 理解向导数据 自动清理 对 调试与审计 的影响。
导读:向导是「临时对话」
向导记录存在 临时表,系统会 定期清理。适合:导入映射、批量改状态、确认破坏性操作。不适合:长期保存的业务主数据。
24.1 TransientModel
24.1.1 知识要点
models.TransientModel:_name唯一;表名通常wizard风格。- 生命周期:短;勿存大附件、勿依赖向导 id 做外链。
default_get:从active_id/active_ids/active_model读上下文。
24.1.2 案例
class LibraryLoanWizard(models.TransientModel):
_name = 'library.loan.wizard'
_description = '批量借阅向导'
book_ids = fields.Many2many('library.book', string='图书')
partner_id = fields.Many2one('res.partner', string='借阅人', required=True)
@api.model
def default_get(self, fields_list):
res = super().default_get(fields_list)
active_ids = self.env.context.get('active_ids', [])
if self.env.context.get('active_model') == 'library.book' and active_ids:
res['book_ids'] = [(6, 0, active_ids)]
return res
24.1.3 截图占位

24.1.4 本节练习
- 简答:向导表数据为何会被清理?大约周期?
- 实操:从 图书列表 多选打开向导,确认
book_ids已预填。 - 判断:向导里
Many2one指向的业务记录被删后,向导行仍永久有效。( )
参考答案提示:3. 错,外键或显示可能异常。
24.2 多步骤向导
24.2.1 知识要点
方案 A:Selection 字段 step + 同一表单 按步骤 invisible 区块。
方案 B:每步 返回新 act_window,res_id 指向 同一条 wizard(需在 context 传 wizard id)。
方案 C:多个 TransientModel 链式(更清晰,文件多)。
24.2.2 案例(单模型两步)
step = fields.Selection([('1', '选书'), ('2', '确认')], default='1')
def action_next(self):
self.step = '2'
def action_apply(self):
self.ensure_one()
Loan = self.env['library.loan']
for book in self.book_ids:
Loan.create({
'book_id': book.id,
'partner_id': self.partner_id.id,
})
return {'type': 'ir.actions.act_window_close'}
24.2.3 截图占位

24.2.4 本节练习
- 实操:第一步 选书,第二步 选借阅人 并 批量创建借阅单。
- 简答:浏览器 后退 对已提交向导的影响?
- UX:字段过多时 分组 / notebook 策略?
24.3 幂等与防重复
24.3.1 知识要点
- 双击「确定」:两次
create业务记录 → 使用request.session令牌、数据库唯一约束、或 按钮disabled+ loading。 - 向导行删除:提交成功后 关闭窗口;失败保留 错误信息。
24.3.2 案例
在业务表对 (book_id, partner_id, state) 建 唯一约束 防止重复借阅(业务允许时)。
24.3.3 本节练习
- 实操:模拟 快速双击,验证是否 双单;再加防护。
- 简答:前端 disabled 与后端 唯一约束 的分工?
24.4 返回值模式
24.4.1 知识要点
| 返回 | 用途 |
|---|---|
act_window_close |
关闭弹窗 |
ir.actions.act_window |
打开列表/表单展示结果 |
ir.actions.client |
刷新等(tag: reload 类,依版本) |
24.4.2 案例
批量创建后打开 借阅列表 并 domain 过滤刚创建的 ids(在 create 时收集)。
24.4.3 本节练习
- 实操:向导结束后 不关闭,改为 跳转结果列表。
本章综合练习
- 幂等:描述 三种 防止重复提交的手段(前/后端/DB)。
- 审计:向导 不保留 对 合规审计 的影响?如何补 message_post?
- 设计:删除确认 向导(输入
DELETE才执行)的字段与校验提纲。 - 拓展:阅读
TransientModel自动清理 cron(若存在),记录周期量级。
本章对应白皮书目录:第二十四章 向导。