Odoo11:根据字段值控制销售订单partner_id的创建与编辑权限
Fix: Conditionally Disable Create/Edit for
partner_id in Sales Orders Based on sale_invoice_type 我看了你这段试图根据sale_invoice_type值控制partner_id创建编辑权限的代码,问题出在两个关键地方:
- 同一个
position="replace"下重复定义了partner_id字段,Odoo视图解析时会冲突,导致逻辑直接失效(通常只会识别最后一个字段,甚至可能引发视图加载报错)。 attrs的invisible条件搞反了——你需要在sale_invoice_type为cash时显示禁用创建编辑的字段,而不是把它隐藏起来。
正确的解决方案
用两个partner_id字段分别对应两种场景,通过attrs控制各自的可见性,同时配置对应的权限:
<field name="partner_id" position="replace"> <!-- 当销售类型为cash时显示,禁用创建/编辑按钮 --> <field name="partner_id" string="Partner" domain="[('customer','=',True),('sale_invoice_type','=',sale_invoice_type)]" context="{'search_default_customer':1, 'show_address': 1,'default_sale_invoice_type':sale_invoice_type}" attrs="{'invisible': [('sale_invoice_type', '!=', 'cash')]}" options='{"always_reload": True, "no_create_edit": True}'/> <!-- 当销售类型为credit时显示,保留创建/编辑权限 --> <field name="partner_id" domain="[('customer','=',True),('sale_invoice_type','=',sale_invoice_type)]" context="{'search_default_customer':1, 'show_address': 1,'default_sale_invoice_type':sale_invoice_type}" attrs="{'invisible': [('sale_invoice_type', '!=', 'credit')]}" options='{"always_reload": True}'/> </field>
关键细节说明
- 两个字段的
domain和context完全一致,确保无论哪种场景下,客户筛选规则和默认值逻辑都保持正确。 - 第一个字段通过
options='{"no_create_edit": True}'禁用了选择弹窗里的创建和编辑按钮,仅在sale_invoice_type为cash时显示。 - 第二个字段不设置
no_create_edit参数,保留默认的创建编辑权限,仅在sale_invoice_type为credit时显示。 - 确保
sale_invoice_type字段在当前视图中是可编辑状态,这样切换类型时,partner_id会自动触发视图刷新,切换对应的显示字段。
这个方案在Odoo 12及以上版本都能稳定生效,是目前实现这类条件权限控制最稳妥的方式。
内容的提问来源于stack exchange,提问作者Thayif kabir
相关产品推荐
相关产品推荐

