Odoo表单添加打开时弹窗警告功能遇问题求助
问题解决方法
你的代码存在几个关键问题,导致功能未生效,同时实现逻辑也不符合“打开表单后弹窗而非阻止加载”的需求,以下是具体修正方案:
原代码的问题分析
- 缩进错误:
record_id仅在if context.get('create') or context.get('edit')块内赋值,非创建/编辑场景下变量未定义,会引发隐性错误。 - 字段名错误:判断时使用了未定义的
required_field,而非你创建的message_warning字段。 - 逻辑不符合需求:
raise UserError会直接阻止表单加载,无法实现“打开表单后弹窗”的效果。 - 参数过时:
form_view_get的access_uid等参数在Odoo新版本中已被弃用,会导致方法执行异常。
推荐实现方案(表单加载后弹窗)
使用前端JS注入的方式,在表单渲染完成后检查字段值并弹出警告,不影响表单正常加载:
from odoo import models, fields, api class YourModel(models.Model): _name = 'model.name' # 替换为你的实际模型名 _description = 'Your Model Description' message_warning = fields.Char(string="Warning") @api.model def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): res = super(YourModel, self).fields_view_get( view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu ) if view_type == 'form': # 注入JS代码到表单视图末尾 js_inject = """ <script type="text/javascript"> $(document).ready(function() { // 获取当前表单的记录ID const formEl = $('.o_form_view'); const recordId = formEl.attr('data-id'); if (recordId) { // 获取当前记录的warning字段值 const recordData = odoo.__DEBUG__.models['model.name'].data[recordId]; if (recordData && recordData.message_warning) { // 使用Odoo原生通知组件(更美观) odoo.action_manager.do_notify( '警告', recordData.message_warning, 'warning' ); // 若需要原生alert,替换为:alert(recordData.message_warning); } } }); </script> """ # 将JS代码插入到表单闭合标签前 res['arch'] = res['arch'].replace('</form>', js_inject + '</form>') return res
方案说明
- 利用
fields_view_get方法修改表单视图的HTML结构,注入自定义JS逻辑。 - 表单加载完成后,通过Odoo的调试数据对象获取当前记录的
message_warning值。 - 使用Odoo原生的通知组件弹出警告,样式与系统保持一致,也可替换为原生
alert。 - 仅在表单视图类型下执行逻辑,不影响其他视图。
备选方案(记录加载时弹窗,Odoo 14+支持)
若使用Odoo 14及以上版本,可直接使用模型的on_record_load方法:
@api.model def on_record_load(self, records): for record in records: if record.message_warning: return { 'warning': { 'title': '警告', 'message': record.message_warning, } }
此方法由Odoo框架原生支持,逻辑更简洁,但仅在加载现有记录时触发,创建新记录时无影响。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

