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

如何修改Odoo中stock.picking模型的默认表单视图?

问题分析与解决方案

你的核心问题是**@api.model装饰的fields_view_get方法中,self指向模型而非具体记录,无法直接读取picking_type_id**,导致视图切换逻辑完全失效。以下是针对性的修复方案:

修复后的fields_view_get代码

@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    # 先获取父类返回的默认视图结构
    res = super(StockPickingInherit2, self).fields_view_get(
        view_id=view_id, 
        view_type=view_type, 
        toolbar=toolbar, 
        submenu=submenu
    )
    
    if view_type == 'form':
        # 场景1:打开已有拣货记录(从many2one/列表进入)
        picking_id = self._context.get('active_id')
        if picking_id:
            picking = self.browse(picking_id)
            self._switch_form_view(res, picking.picking_type_id.code)
        
        # 场景2:新建拣货记录(从菜单/快速创建进入)
        else:
            default_picking_type_id = self._context.get('default_picking_type_id')
            if default_picking_type_id:
                picking_type = self.env['stock.picking.type'].browse(default_picking_type_id)
                self._switch_form_view(res, picking_type.code)
    
    return res

def _switch_form_view(self, res, picking_type_code):
    """封装视图切换逻辑,避免重复代码"""
    view_mapping = {
        "outgoing": "gg_warehouse.wh_os_outgoing_form",
        "incoming": "gg_warehouse.wh_os_incoming_form",
        "internal": "gg_warehouse.wh_os_transfer_form"
    }
    if picking_type_code in view_mapping:
        custom_view = self.env.ref(view_mapping[picking_type_code])
        res['view_id'] = custom_view.id
        res['arch'] = custom_view.arch

关键修复点说明

  1. 获取当前记录/默认类型:
    • 通过self._context.get('active_id')读取已打开记录的ID,查询对应拣货类型
    • 新建记录时,通过default_picking_type_id获取预设的拣货类型,提前加载对应视图
  2. 替换视图结构:
    • 不仅要修改view_id,还要替换arch(视图的XML结构),确保刷新页面后视图不会回退
    • 用_switch_form_view方法封装重复逻辑,提高代码可读性
  3. 兼容所有场景:
    • 覆盖从many2one打开、列表进入、新建记录、页面刷新等所有场景,彻底替换默认视图

额外注意事项

  • 确保自定义视图继承自Odoo默认的stock.picking表单视图,避免丢失原有功能(如按钮、字段逻辑)
  • 检查用户权限,确保相关角色拥有自定义视图的访问权限
  • 如果需要对特定菜单单独配置视图,也可以通过修改ir.actions.act_window的view_id参数实现,但上述代码的动态切换方式更通用

内容的提问来源于stack exchange,提问作者Admaja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:10:40