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

如何在Odoo的Many2one字段仅保留创建选项并隐藏所有现有项

解决方案:Odoo Many2one字段仅允许创建新记录,隐藏现有选项

我来帮你搞定这个需求——要让payment_term_id这个Many2one字段只允许用户创建新的付款条件,完全隐藏现有选项,你之前的配置方向有点反了,我给你梳理下正确的做法:

问题根源

你原来视图里的options="{'no_create': True}"是禁止创建新记录,这和你的需求完全相反;而no_open: True只是禁止点击现有记录打开详情页,并不会隐藏这些选项,所以才没用。

正确配置方案

我们需要通过两个关键设置实现需求:

  1. 用domain过滤掉所有现有记录,让下拉框空无一物
  2. 确保开启创建新记录的功能(默认就是开启的,别禁用)
  3. 加上no_open: True做额外防护

修改后的视图代码(account_invoice_view.xml)

<field name="payment_term_id" 
       options="{'no_open': True}" 
       domain="[('id', '=', -1)]"
       attrs="{'readonly': [('state', '!=', 'draft')]}"/>

配置说明

  • domain="[('id', '=', -1)]":Odoo里所有记录的ID都是正整数,这个domain会过滤掉所有现有付款条件,下拉框自然就没有可选选项了。
  • options="{'no_open': True}":即使有意外情况出现(比如domain没生效),也能阻止用户打开现有记录,进一步确保只能新建。
  • attrs调整:把原来的隐藏逻辑改成和模型字段匹配的只读逻辑——只有草稿(draft)状态下可编辑,其他状态只读,符合业务逻辑。

模型代码无需修改

你的account.invoice模型里的payment_term_id字段设置没问题,保持原样即可:

class AccountInvoice(models.Model):
    _name = "account.invoice"
    payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms', oldname='payment_term', readonly=True, states={'draft': [('readonly', False)]})

这样配置后,用户点击payment_term_id字段时,下拉框不会显示任何现有付款条件,只能通过「创建并编辑」按钮来新增新的付款条件,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:13:38