Odoo15 不同上下文下显示不同Form视图问题求助
我看你遇到的问题挺典型的——想在菜单入口和按钮触发两个场景下,分别展示client.payment模型的两个不同Form视图,但现在要么视图冲突显示不对,要么优先级配置没起作用,甚至出现两个视图并排的情况。咱们一步步来调整配置解决:
1. 简化菜单关联的Action配置,避免视图冲突
你原来的action里同时设置了view_id、view_ids和context里的form_view_ref,这几个配置容易互相干扰,导致Odoo加载视图时混乱。建议直接用view_ids显式绑定该action要使用的视图集合,这比优先级和单独的view_id更可靠:
<record id="client_payment_act_window" model="ir.actions.act_window"> <field name="name">Paiements client</field> <field name="type">ir.actions.act_window</field> <field name="res_model">client.payment</field> <field name="view_mode">tree,form</field> <!-- 明确指定该action绑定的tree和form视图,清除其他冗余配置 --> <field name="view_ids" eval="[(5,0,0), (0, 0, {'view_mode': 'tree', 'view_id': ref('module_name.client_payment_tree_view')}), (0, 0, {'view_mode': 'form', 'view_id': ref('module_name.client_payment_form_view')})]"/> <!-- 移除原来的view_id和context里的form_view_ref,避免干扰 --> </record>
这样配置后,菜单入口打开的列表和表单视图就被牢牢绑定了,不会被其他视图覆盖。
2. 完善按钮触发的Python Action,确保独立显示
你的按钮方法基本没问题,但要加上res_id(打开当前操作的记录,而不是新建),同时在context里明确指定视图ref,彻底避免继承菜单的视图配置:
def register_payment(self): # 获取目标视图ID target_view = self.env.ref('module_name.client_payment_form_view_for_bl').id return { 'res_model': 'client.payment', 'res_id': self.id, # 关键:打开当前操作的这条记录,而不是新建 'type': 'ir.actions.act_window', 'target': 'new', # 弹出新窗口,彻底和原视图分离,不会并排 'view_mode': 'form', 'view_id': target_view, 'context': {'form_view_ref': 'module_name.client_payment_form_view_for_bl'} # 再次明确视图,防止Odoo加载其他视图 }
这里的target='new'会让视图以弹窗形式打开,完全和原来的页面分离,解决并排显示的问题;res_id则保证打开的是当前你操作的那条付款记录。
3. 兜底:调整视图优先级(可选)
虽然我们已经通过action明确绑定了视图,但为了保险,可以调整两个视图的优先级,避免意外:
- 菜单用的
client_payment_form_view优先级设为更高(比如eval="100") - 按钮用的
client_payment_form_view_for_bl优先级设为更低(比如eval="2")
这样即使action配置出问题,Odoo也会优先加载菜单对应的视图,而按钮触发时因为明确指定了view_id,优先级不会影响弹窗的视图。
4. 确认视图无继承关系
你现在的两个视图都是独立的,没有继承关系,这是对的!如果之前有继承过视图,一定要确保现在的两个Form视图的arch都是完整的结构,没有从对方继承,这样就不会出现视图元素合并显示的情况。
按照上面的步骤调整后,菜单入口会稳定加载你指定的标准Form视图,点击按钮则会弹出新窗口显示另一个简化版的视图,不会再出现串位或者并排的问题啦。
内容的提问来源于stack exchange,提问作者Ka_

