如何修改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
关键修复点说明
- 获取当前记录/默认类型:
- 通过
self._context.get('active_id')读取已打开记录的ID,查询对应拣货类型 - 新建记录时,通过
default_picking_type_id获取预设的拣货类型,提前加载对应视图
- 通过
- 替换视图结构:
- 不仅要修改
view_id,还要替换arch(视图的XML结构),确保刷新页面后视图不会回退 - 用
_switch_form_view方法封装重复逻辑,提高代码可读性
- 不仅要修改
- 兼容所有场景:
- 覆盖从many2one打开、列表进入、新建记录、页面刷新等所有场景,彻底替换默认视图
额外注意事项
- 确保自定义视图继承自Odoo默认的stock.picking表单视图,避免丢失原有功能(如按钮、字段逻辑)
- 检查用户权限,确保相关角色拥有自定义视图的访问权限
- 如果需要对特定菜单单独配置视图,也可以通过修改
ir.actions.act_window的view_id参数实现,但上述代码的动态切换方式更通用
内容的提问来源于stack exchange,提问作者Admaja
相关产品推荐
相关产品推荐

