Odoo如何无刷新更新字段值?点击按钮后页面重载值不显示问题
问题原因
出现点击按钮后页面自动重载、字段值不显示的问题,核心原因有两个:
- 你绑定的
refresh_credits方法执行完成后没有返回任何前端动作指令,Odoo对type="object"类型的按钮默认会触发整页提交重载。 res.config.settings是临时向导模型(TransientModel),你在方法内给字段赋的值只存在于当前请求的内存中,没有持久化,页面重载时重新拉取记录自然读不到刚赋值的内容,后台日志能打印值是因为赋值逻辑在请求内存中执行成功了。
修复方案
1. 修改Python端代码
给方法补充返回当前视图的刷新动作,同时根据你的需求补全字段的持久化逻辑,修改后代码如下:
from odoo import models, fields import logging _logger = logging.getLogger(__name__) class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' # 如果不需要持久化存储这个积分值,只是点击按钮临时展示,可以去掉config_parameter参数 new_credits = fields.Integer(string="Credits", config_parameter="custom_module.new_credits") def refresh_credits(self): self.ensure_one() credit_data = self.env['show.credits'].content_credits_info() target_credit = credit_data[4] _logger.info("拉取到的积分值:%s", target_credit) self.new_credits = target_credit # 核心:返回当前向导的窗口动作,重载当前记录,替代默认的整页回退逻辑 return { "type": "ir.actions.act_window", "res_model": self._name, "res_id": self.id, "view_mode": "form", "target": "current", }
如果你没有给字段加
config_parameter自动关联系统参数,需要自己重写设置模型的get_values、set_values方法完成值的读写,否则页面刷新后值还是会丢失。
2. XML代码调整(可选)
现有XML代码不需要大改,如果要避免按钮点击时触发表单上其他字段的校验,可以给按钮增加no_validate类,修改后如下:
<button type="object" name="refresh_credits" class="btn-link no_validate" icon="fa-refresh"/> <span class="btn-link">Credits</span> <field name="new_credits"/>
修改完成后升级自定义模块,点击刷新按钮就会正常拉取积分值显示在字段中,不会出现无意义的整页重载丢值问题。
内容的提问来源于stack exchange,提问作者arleite
相关产品推荐
相关产品推荐

