Odoo12自定义弹窗实现与优化实践
1. 项目背景与需求分析在Odoo12开发过程中系统默认的消息提示机制存在几个明显痛点。最常见的就是使用raise抛出UserError或Warning异常时会显示Odoo Server Error这样的系统错误标题不仅视觉上不专业更重要的是在Dialog弹窗场景下会导致表单数据丢失。这种体验对终端用户极不友好。我在实际项目中就遇到过这样的案例财务人员在审核付款单时系统提示供应商银行信息不完整但由于使用了传统的异常抛出方式导致已填写的20多个字段数据全部清空。这种设计缺陷直接影响了业务流程效率。2. 技术方案设计思路2.1 传统方案的局限性Odoo原生提供的消息提示方式主要有raise UserError(message)raise Warning(message)return { warning: {title: 提示, message: 内容} }这些方式共同的缺点是样式不可定制始终带有错误警示标识弹窗关闭后无法执行回调函数在复杂表单中可能引发数据丢失2.2 自定义弹窗的优势我们采用TransientModel临时模型 自定义视图的方案可以实现完全可控的UI样式支持自定义按钮和回调事件保持主表单数据不丢失可扩展的交互逻辑3. 完整实现步骤3.1 创建消息向导模型在models目录下新建my_message_wizard.pyfrom odoo import models, fields, api class MyMessageWizard(models.TransientModel): _name my.message.wizard _description 自定义消息弹窗 message fields.Text( string消息内容, requiredTrue, readonlyTrue ) api.multi def action_confirm(self): 确认按钮回调方法 return {type: ir.actions.act_window_close}关键点说明必须继承TransientModel而非Model字段设置为readonly防止误修改返回标准窗口关闭动作3.2 设计弹窗视图在views目录创建my_message_wizard.xmlodoo record idmy_message_wizard_form modelir.ui.view field namenamemessage.wizard.form/field field namemodelmy.message.wizard/field field namearch typexml form string系统提示 sheet div classoe_title h1i classfa fa-info-circle/ 重要提示/h1 /div group field namemessage classoe_inline widgethtml/ /group /sheet footer button nameaction_confirm string确认 typeobject classbtn-primary default_focus1/ /footer /form /field /record /odoo视图设计技巧使用sheet和group规范布局添加Font Awesome图标增强视觉效果采用html widget支持富文本内容设置default_focus让按钮自动获得焦点3.3 注册模块资源在__manifest__.py中添加data: [ views/my_message_wizard.xml, ],3.4 业务逻辑调用示例在需要提示的地方调用def button_validate(self): if not self.partner_id: message self.env[my.message.wizard].create({ message: p请先选择业务伙伴/p ul li该提示不会中断业务流程/li li表单数据将保持原状/li /ul }) return { name: 缺失必填项, type: ir.actions.act_window, view_mode: form, res_model: my.message.wizard, res_id: message.id, target: new, context: self._context, flags: {mode: readonly} } # 正常业务逻辑...4. 高级功能扩展4.1 多按钮交互改造action_confirm方法def action_choice(self, choice): if choice confirm: self.env[res.partner].search([...]).do_something() return {type: ir.actions.act_window_close} # 视图添加 button nameaction_choice string同意 typeobject args(confirm,)/ button nameaction_choice string拒绝 typeobject args(reject,)/4.2 自动关闭定时器在js文件中添加setTimeout(function() { $(.modal).modal(hide); }, 5000); // 5秒后自动关闭4.3 响应式布局适配添加CSS类sheet classmsg-responsive style .msg-responsive { min-width: 300px; max-width: 80%; margin: 0 auto; } media (max-width: 768px) { .msg-responsive { max-width: 95%; } } /style ... /sheet5. 常见问题排查5.1 弹窗不显示检查步骤确认__manifest__.py已注册XML文件检查视图record id是否唯一查看浏览器控制台是否有JS错误5.2 按钮无响应调试方法在方法开始添加_logger.debug调试输出检查是否缺少api.multi装饰器确认按钮typeobject而非typeaction5.3 样式异常解决方案检查是否与其他模块CSS冲突确保正确加载了Font Awesome使用浏览器开发者工具审查元素6. 性能优化建议对频繁调用的提示内容使用缓存tools.ormcache(message_content) def get_message_id(self, message_content): return self.create({message: message_content}).id批量处理时避免N1查询# 错误做法 for record in records: record.show_message(...) # 正确做法 message_ids self.env[my.message.wizard].create_batch([...])使用web_ajax代替完整弹窗odoo.define(module, function (require) { use strict; var core require(web.core); var Widget require(web.Widget); var MyWidget Widget.extend({ showToast: function(message) { this.do_notify(_t(提示), message); } }); });我在实际项目中发现当需要连续显示多个提示时采用通知(toast)样式比模态弹窗更合适。特别是在导出入库单这类批量操作场景下可以显著改善用户体验。

相关新闻

C语言编程入门:从基础概念到开发环境配置

C语言编程入门:从基础概念到开发环境配置

1. C语言编程预备知识概述第一次接触C语言时,很多人会被各种概念和术语搞得晕头转向。作为一个从1998年就开始写C的老程序员,我想用最直白的方式帮你理清这些基础知识。C语言之所以被称为"编程界的拉丁语",不仅因为它的历史悠久&am…

2026/7/19 21:44:17 阅读更多 →
Java环境配置与JDK安装全指南

Java环境配置与JDK安装全指南

1. Java环境配置基础概念Java环境配置是每个Java开发者必须掌握的基础技能。简单来说,它就是在你的操作系统上设置好Java开发所需的工具和路径,让系统能够识别和执行Java命令。这就像给电脑安装一个"翻译官",让它能听懂并执行Java语…

2026/7/19 21:44:17 阅读更多 →
Android开源项目全流程打造与专业徽章配置指南

Android开源项目全流程打造与专业徽章配置指南

1. Android开源项目全流程打造指南 作为一个长期活跃在GitHub社区的Android开发者,我经常被问到一个问题:"如何让自己的开源项目看起来更专业?"今天我就来分享一套完整的Android开源项目打造方案,从项目创建到各种专业…

2026/7/19 21:44:17 阅读更多 →

最新新闻

GitHub加速神器:3分钟解决国内开发者下载难题

GitHub加速神器:3分钟解决国内开发者下载难题

GitHub加速神器:3分钟解决国内开发者下载难题 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub的龟速下载而…

2026/7/20 10:33:40 阅读更多 →
短链系统设计?

短链系统设计?

核心业务流程 短链系统的核心任务是将一个长的 URL 转换为一个短的 URL,并在用户访问短链时,快速、准确地重定向到原始链接短链系统的核心只有两个动作:生成短链 和 重定向访问 生成短链(长变短) 长链接 →\rightarrow…

2026/7/20 10:33:40 阅读更多 →
区块链钱包技术解析与2026年趋势预测

区块链钱包技术解析与2026年趋势预测

1. 区块链钱包基础认知2026年还未到来,但区块链钱包的进化轨迹已经清晰可见。作为数字资产管理的核心工具,现代区块链钱包早已超越简单的存储功能,成为连接Web3生态的超级入口。我至今记得2017年那个深夜,因为误删了钱包应用又没备…

2026/7/20 10:33:40 阅读更多 →
Beyond Compare 5终极激活指南:3步轻松获取永久授权密钥

Beyond Compare 5终极激活指南:3步轻松获取永久授权密钥

Beyond Compare 5终极激活指南:3步轻松获取永久授权密钥 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 还在为Beyond Compare 5的30天试用期到期而烦恼吗?这款业界领先的…

2026/7/20 10:33:40 阅读更多 →
沈阳叉车证怎么选?华龙技校郝老师揭秘避坑指南与零基础速成秘诀

沈阳叉车证怎么选?华龙技校郝老师揭秘避坑指南与零基础速成秘诀

写在前面 大家好,我是沈阳市华龙职业技术学校的郝老师,多年来一直专注沈阳本地叉车实操培训、N1叉车证报考指导工作。 平时不管是线下学员,还是线上私信我的朋友,问得最多的一个问题就是:在沈阳想考叉车证,…

2026/7/20 10:33:40 阅读更多 →
HiPlot:高维数据交互式探索的平行坐标实践指南

HiPlot:高维数据交互式探索的平行坐标实践指南

1. 项目概述:HiPlot 不是又一个图表库,而是高维数据的“显微镜”与“导航仪”HiPlot 这个名字听起来平平无奇,但如果你正被几十个、上百个特征变量缠住——比如在用户行为分析中要同时看年龄、地域、设备型号、访问时长、点击路径深度、页面停…

2026/7/20 10:32:38 阅读更多 →

日新闻

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:00:34 阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:00:34 阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:00:34 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 5:57:49 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 4:31:26 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 5:56:42 阅读更多 →

月新闻