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
相关产品推荐
相关产品推荐

