Odoo 10.0表单视图如何分别显示客户/供应商发票?
解决Odoo 10.0中客户/供应商表单分别显示对应发票的问题
要实现客户表单仅显示客户发票(out_invoice类型)、供应商表单仅显示供应商发票(in_invoice类型),你可以通过视图继承分别设置字段domain的方式来实现,这是最直接且可靠的方案,具体步骤如下:
1. 保留基础字段定义
你现有的字段定义可以保留基础的state='open'过滤,后续在视图中补充发票类型的过滤条件:
invoice_id = fields.Many2one('account.invoice', 'Invoice', domain=[('state','=','open')])
2. 继承客户表单视图,添加字段并设置专属Domain
在你的模块XML文件中,继承Odoo默认的客户表单视图,将invoice_id字段添加到合适位置,并限制仅显示客户发票:
<record id="view_partner_customer_invoice_field" model="ir.ui.view"> <field name="name">res.partner.customer.form.invoice.field</field> <field name="model">res.partner</field> <!-- 继承默认客户表单视图 --> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <!-- 这里以添加在邮箱字段后为例,你可以根据需求调整xpath定位 --> <xpath expr="//field[@name='email']" position="after"> <field name="invoice_id" domain="[('state','=','open'), ('type','=','out_invoice')]"/> </xpath> </field> </record>
3. 继承供应商表单视图,添加字段并设置专属Domain
同样在XML中,继承默认的供应商表单视图,添加字段并限制仅显示供应商发票:
<record id="view_partner_supplier_invoice_field" model="ir.ui.view"> <field name="name">res.partner.supplier.form.invoice.field</field> <field name="model">res.partner</field> <!-- 继承默认供应商表单视图 --> <field name="inherit_id" ref="base.view_partner_supplier_form"/> <field name="arch" type="xml"> <!-- 同样可根据需求调整字段位置 --> <xpath expr="//field[@name='email']" position="after"> <field name="invoice_id" domain="[('state','=','open'), ('type','=','in_invoice')]"/> </xpath> </field> </record>
额外说明
- 字段位置调整:你可以修改
xpath的expr值,将字段放在表单的任意位置,比如某个分组(group)内,只需定位到对应的元素即可。 - 动态Domain备选方案:如果想通过字段本身的动态Domain实现,也可以用lambda表达式根据当前伙伴类型过滤,但这种方式对新建记录的上下文依赖较强,不如视图层面的控制直观:
这种方式下,打开现有客户/供应商记录时能正确过滤,但新建记录时需要确保上下文传递了invoice_id = fields.Many2one('account.invoice', 'Invoice', domain=lambda self: [ ('state', '=', 'open'), ('type', '=', 'out_invoice' if self.customer else 'in_invoice') ])customer或supplier的默认值,否则可能不符合预期。
内容的提问来源于stack exchange,提问作者bjr_tlb
相关产品推荐
相关产品推荐

