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

Odoo表单添加打开时弹窗警告功能遇问题求助

问题解决方法

你的代码存在几个关键问题,导致功能未生效,同时实现逻辑也不符合“打开表单后弹窗而非阻止加载”的需求,以下是具体修正方案:

原代码的问题分析

  1. 缩进错误:record_id仅在if context.get('create') or context.get('edit')块内赋值,非创建/编辑场景下变量未定义,会引发隐性错误。
  2. 字段名错误:判断时使用了未定义的required_field,而非你创建的message_warning字段。
  3. 逻辑不符合需求:raise UserError会直接阻止表单加载,无法实现“打开表单后弹窗”的效果。
  4. 参数过时: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:18:17