You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Odoo V10状态栏中显示上一、当前及下一阶段?

实现Odoo状态栏显示当前、上一及下一阶段的方案

我来帮你搞定这个需求——在Odoo的状态栏里展示当前、上一和下一阶段,结合你给出的代码,咱们一步步调整优化:

1. 先修正现有代码的明显问题

你XML里的domain写错了,当前写的是[('stage_name', '=', workflow_stage)],这会导致过滤逻辑错误,应该和Python字段里的domain保持一致,改成[('stage_name', '=', work_flow_type)],这样才能正确筛选出当前流程类型下的所有阶段。

修正后的XML字段:

<field name="workflow_stage" domain="[('stage_name', '=', work_flow_type)]" widget="statusbar" options="{'fold_field': 'fold'}"/>

2. 确保阶段模型的基础配置正确

你的stage.name模型需要有顺序字段来控制阶段的先后顺序,否则状态栏里的阶段会乱序。如果还没加,赶紧补充:

class StageName(models.Model):
    _name = 'stage.name'
    _order = 'sequence'  # 核心:按sequence从小到大排列阶段

    name = fields.Char('Stage Name', required=True)
    stage_name = fields.Char('Workflow Type')  # 和主模型的work_flow_type字段对应
    sequence = fields.Integer('Sequence', default=10)  # 控制阶段顺序,数字越小越靠前
    fold = fields.Boolean('Folded in Kanban')  # 和你XML里的fold_field对应

3. 实现状态栏显示全流程阶段(含当前、前后阶段)

Odoo的statusbar widget默认会展示所有符合domain的阶段,当前选中的阶段会自动高亮,前后阶段会显示在它的左右两侧。只要你确保:

  • 阶段模型按sequence正确排序
  • domain能筛选出当前流程的所有阶段
  • 每个阶段的stage_name和主模型的work_flow_type匹配

这样状态栏就会自动显示当前阶段,以及它的上一、下一阶段(如果存在的话)。

4. 额外需求:单独显示“上一阶段”/“下一阶段”字段

如果需要在表单上单独标注出上一和下一阶段(比如在状态栏旁边显示文字),可以给主模型添加计算字段:

class YourMainModel(models.Model):
    _name = 'your.main.model'  # 替换成你的主模型名称

    workflow_stage = fields.Many2one('stage.name', group_expand='_operation_process_stage_ids', domain="[('stage_name', '=', work_flow_type)]")
    work_flow_type = fields.Char('Workflow Type')  # 确保这个字段存在并正确赋值
    previous_stage = fields.Many2one('stage.name', compute='_compute_previous_next_stage', string='Previous Stage')
    next_stage = fields.Many2one('stage.name', compute='_compute_previous_next_stage', string='Next Stage')

    @api.depends('workflow_stage', 'work_flow_type')
    def _compute_previous_next_stage(self):
        for record in self:
            if not record.workflow_stage or not record.work_flow_type:
                record.previous_stage = record.next_stage = False
                continue
            # 获取当前流程的所有阶段,按顺序排列
            stages = self.env['stage.name'].search([
                ('stage_name', '=', record.work_flow_type)
            ], order='sequence')
            try:
                stage_index = stages.ids.index(record.workflow_stage.id)
                # 赋值上一阶段
                record.previous_stage = stages[stage_index - 1] if stage_index > 0 else False
                # 赋值下一阶段
                record.next_stage = stages[stage_index + 1] if stage_index < len(stages) - 1 else False
            except ValueError:
                # 防止当前阶段不在筛选结果中的异常情况
                record.previous_stage = record.next_stage = False

然后在XML表单里添加这些字段,和状态栏配合展示:

<div class="oe_row">
    <div class="oe_span4">
        <field name="previous_stage" readonly="1" class="oe_text-muted"/>
    </div>
    <div class="oe_span4">
        <field name="workflow_stage" widget="statusbar" domain="[('stage_name', '=', work_flow_type)]" options="{'fold_field': 'fold'}"/>
    </div>
    <div class="oe_span4">
        <field name="next_stage" readonly="1" class="oe_text-muted"/>
    </div>
</div>

5. 常见问题排查

  • 如果状态栏只显示当前阶段:检查domain是否正确,或者stage.name中对应work_flow_type的阶段是否只有一个
  • 阶段顺序混乱:确认stage.name模型的_order是按sequence排序,且每个阶段的sequence值设置正确
  • 计算字段不更新:检查@api.depends里的字段是否包含了所有依赖项,比如work_flow_type和workflow_stage

内容的提问来源于stack exchange,提问作者Pawan Kumar Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:28:38