Odoo 8中如何按条件显示/隐藏继承的库存报表菜单
解决Odoo 8中按记录状态控制报表菜单显示的问题
首先得明确:你之前的写法无效是因为Odoo 8里<report>标签的menu属性只支持静态布尔值(True/False),根本没法直接写动态域表达式来根据记录状态控制显示。要实现你要的效果,得换个思路——通过继承表单视图来控制报表对应菜单项的可见性,这是Odoo 8里最直接的实现方式,而且完全符合你“必须通过继承实现”的要求。
具体实现步骤
1. 继承库存调拨单的表单视图
在你的自定义模块里创建视图继承文件,针对stock.picking的表单视图,找到打印下拉菜单里对应报表的按钮/菜单项,给它加上动态可见性的控制属性。
下面是完整的代码示例:
<odoo> <data> <!-- 继承原生库存调拨单表单视图 --> <record id="view_picking_form_inherit_custom" model="ir.ui.view"> <field name="name">stock.picking.form.inherit.custom</field> <field name="model">stock.picking</field> <field name="inherit_id" ref="stock.view_picking_form"/> <field name="arch" type="xml"> <!-- 定位到打印按钮对应的报表动作 --> <xpath expr="//button[@name='%(stock.action_report_picking)d']" position="attributes"> <!-- 设置当state为assigned时隐藏该按钮 --> <attribute name="attrs">{'invisible': [('state', '=', 'assigned')]}</attribute> </xpath> <!-- 如果报表是在下拉菜单的menuitem里,补充这段代码适配 --> <xpath expr="//menuitem[@action='stock.action_report_picking']" position="attributes"> <attribute name="attrs">{'invisible': [('state', '=', 'assigned')]}</attribute> </xpath> </field> </record> </data> </odoo>
2. 代码细节说明
- XPath定位:这里用
xpath精准找到原生视图里对应报表的按钮/菜单项,你可能需要根据Odoo 8的实际视图结构微调expr内容(比如部分版本里打印按钮是在<header>的<dropdown>容器内)。 - attrs属性控制:
{'invisible': [('state', '=', 'assigned')]}的逻辑很直白——当stock.picking的state等于assigned时,该控件自动隐藏;其他状态下正常显示,完美匹配你的需求。
为什么你的原写法行不通?
Odoo 8的<report>标签里的menu参数只是个全局开关,用来控制报表是否出现在打印菜单里,是静态配置,不支持动态的域表达式。所以要实现基于记录状态的动态显示,必须从视图层面入手,直接控制具体控件的可见性。
额外调试小技巧
如果上面的XPath定位没找到目标控件,你可以打开Odoo开发者模式,查看stock.picking表单视图的源代码,找到对应报表动作的按钮/菜单项的具体位置,再调整XPath表达式即可。
内容的提问来源于stack exchange,提问作者Shahjalal
相关产品推荐
相关产品推荐

