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

如何按条件显示/隐藏顶部打印菜单项?Odoo发票报表适配

解决Odoo报表打印菜单项仅对'in_invoice'类型可见的问题

嘿,我明白你遇到的问题了——原来想用menu属性控制报表打印项的可见性,但这个属性根本不是干这个的,它是用来关联报表到某个顶级菜单入口的,没法引用object对象判断记录类型,所以才会报错。下面给你两种靠谱的解决方案:

方案一:用报表的binding_domain属性直接过滤(推荐)

Odoo的报表定义支持binding_domain属性,它可以直接指定哪些记录能看到这个报表的打印选项。只需要在你的报表XML里加上这个属性,设置过滤条件为发票类型等于in_invoice就行。

修改后的报表代码:

<report 
    id="account_att" 
    model="account.invoice" 
    string="Att" 
    report_type="qweb-pdf" 
    name="account.report_att" 
    attachment="('Att'+(object.number or '').replace('/','')+'.pdf')" 
    print_report_name="'Att for '+(object._get_printed_report_name())"
    binding_domain="[('type', '=', 'in_invoice')]"
/>

这个方法的好处是一劳永逸:不管是在表单视图的打印菜单,还是列表视图的批量打印里,只有类型为in_invoice的发票才会显示这个报表选项,不需要额外修改视图。

方案二:继承表单视图,控制打印按钮可见性

如果你需要更精细的控制(比如只在特定表单视图里隐藏按钮),可以继承发票的表单视图,给对应的打印按钮添加可见性条件。

示例代码:

<record id="account_invoice_form_inherit" model="ir.ui.view">
    <field name="name">account.invoice.form.inherit</field>
    <field name="model">account.invoice</field>
    <field name="inherit_id" ref="account.invoice_form"/>
    <field name="arch" type="xml">
        <!-- 定位到报表对应的打印按钮,修改其可见性 -->
        <xpath expr="//div[@name='button_box']/button[@name='%(account_att)d']" position="attributes">
            <attribute name="attrs">{'invisible': [('type', '!=', 'in_invoice')]}</attribute>
        </xpath>
    </field>
</record>

这个方法是直接在表单视图的按钮上设置规则:当发票类型不是in_invoice时,该打印按钮会自动隐藏。需要注意的是,这里的%(account_att)d是你的报表ID的动态引用,确保和你定义的报表ID一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:43:53