如何在Odoo的Many2one字段仅保留创建选项并隐藏所有现有项
解决方案:Odoo Many2one字段仅允许创建新记录,隐藏现有选项
我来帮你搞定这个需求——要让payment_term_id这个Many2one字段只允许用户创建新的付款条件,完全隐藏现有选项,你之前的配置方向有点反了,我给你梳理下正确的做法:
问题根源
你原来视图里的options="{'no_create': True}"是禁止创建新记录,这和你的需求完全相反;而no_open: True只是禁止点击现有记录打开详情页,并不会隐藏这些选项,所以才没用。
正确配置方案
我们需要通过两个关键设置实现需求:
- 用
domain过滤掉所有现有记录,让下拉框空无一物 - 确保开启创建新记录的功能(默认就是开启的,别禁用)
- 加上
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
相关产品推荐
相关产品推荐

