如何在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
相关产品推荐
相关产品推荐

