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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:41:12