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

Odoo视图通过XML或JavaScript实现复选框取消勾选清空文本框的方法

实现方案

该需求可通过多种方式实现,优先推荐Python后端onchange方案,符合Odoo常规开发规范,稳定性更高,无需额外开发前端逻辑。


方案1:Python onchange实现(推荐)

在你现有模型代码中新增以下方法即可:

@api.onchange('expend_percetage', 'fixed_expend')
def _clear_percent_amount_when_uncheck(self):
    # 两个复选框都未勾选时清空输入值
    if not self.expend_percetage and not self.fixed_expend:
        self.percent_amount = 0.0  # 可根据字段类型调整为None/False
    # 如需切换勾选选项时也清空历史输入,可放开下面的逻辑
    # if self.expend_percetage or self.fixed_expend:
    #     self.percent_amount = 0.0

该方法会自动监听两个复选框的状态变化,用户修改勾选状态时自动触发逻辑,和你现有校验逻辑完全兼容,不会出现数据不一致问题。


方案2:XML视图配置实现

如果不想修改后端模型代码,可直接在XML视图的字段上绑定onchange事件,修改你现有XML代码如下:

<field name="expend_percetage" 
       on_change="_clear_percent_amount_when_uncheck(expend_percetage, fixed_expend)"
       attrs="{'readonly':[('state', 'in', ('done','cancel','sale'))],
              'invisible':[('fixed_expend', '=', True)]}" />

<field name="fixed_expend" 
       on_change="_clear_percent_amount_when_uncheck(expend_percetage, fixed_expend)"
       attrs="{'readonly':[('state', 'in', ('done','cancel','sale'))],
              'invisible':[('expend_percetage', '=', True)]}" />

<field name="percent_amount" nolabel="1"
       attrs="{'invisible':['&',('expend_percetage', '=', False),('fixed_expend', '=', False)],
               'readonly': [('state', 'in', ('done','cancel','sale'))] }"/>

逻辑和方案1一致,只是把事件绑定放在了视图层。


方案3:前端JavaScript实现(仅作参考,不推荐)

如果需要纯前端实现不触发后端请求,可扩展form视图控制器,代码示例如下:

odoo.define('your_module_name.clear_input_widget', function (require) {
    "use strict";
    const FormController = require('web.FormController');
    FormController.include({
        _onFieldChanged: function (ev) {
            this._super.apply(this, arguments);
            const fieldName = ev.data.name;
            if (fieldName === 'expend_percetage' || fieldName === 'fixed_expend') {
                const record = ev.data.record;
                if (!record.data.expend_percetage && !record.data.fixed_expend) {
                    this.model.update(record.id, {percent_amount: 0.0});
                }
            }
        }
    });
});

需将该JS文件注册到模块的资源清单中才能生效,该方案容易出现前后端数据不一致问题,非必要不建议使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:15:04