第二十四章 向导(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 向导弹窗

24.1.4 本节练习

  1. 简答:向导表数据为何会被清理?大约周期?
  2. 实操:从 图书列表 多选打开向导,确认 book_ids 已预填
  3. 判断:向导里 Many2one 指向的业务记录被删后,向导行仍永久有效。( )

参考答案提示:3. 错,外键或显示可能异常。


24.2 多步骤向导

24.2.1 知识要点

方案 ASelection 字段 step + 同一表单 按步骤 invisible 区块。

方案 B:每步 返回新 act_windowres_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 分步 UI

24.2.4 本节练习

  1. 实操:第一步 选书,第二步 选借阅人批量创建借阅单
  2. 简答:浏览器 后退 对已提交向导的影响?
  3. UX:字段过多时 分组 / notebook 策略?

24.3 幂等与防重复

24.3.1 知识要点

  • 双击「确定」:两次 create 业务记录 → 使用 request.session 令牌数据库唯一约束、或 按钮 disabled + loading
  • 向导行删除:提交成功后 关闭窗口;失败保留 错误信息

24.3.2 案例

在业务表对 (book_id, partner_id, state)唯一约束 防止重复借阅(业务允许时)。

24.3.3 本节练习

  1. 实操:模拟 快速双击,验证是否 双单;再加防护。
  2. 简答:前端 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 本节练习

  1. 实操:向导结束后 不关闭,改为 跳转结果列表

本章综合练习

  1. 幂等:描述 三种 防止重复提交的手段(前/后端/DB)。
  2. 审计:向导 不保留合规审计 的影响?如何补 message_post
  3. 设计删除确认 向导(输入 DELETE 才执行)的字段与校验提纲。
  4. 拓展:阅读 TransientModel 自动清理 cron(若存在),记录周期量级。

本章对应白皮书目录:第二十四章 向导。