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

Django Admin中使用jQuery阻止默认提交后丢失保存功能的问题

解决Django Admin模态框提交丢失保存选项功能的问题

我太懂你遇到的这个坑了!之前在Django Admin里搞自定义模态框时,我也踩过一模一样的问题——直接阻止表单提交再调用submit(),确实会丢掉那些“保存并添加另一个”“保存并继续编辑”的功能,核心原因是你没捕获到触发提交的具体按钮。

Django Admin的这些特殊保存按钮,是靠按钮的name属性(比如_save_and_add_another、_save_and_continue)来告诉后端要执行哪种操作的。你的原代码只存了表单对象,直接提交时并没有带上这些按钮的参数,后端自然不知道该走哪个分支逻辑。

给你两种可行的解决方案:

方案一:捕获触发按钮,模拟点击提交

这种方式最贴近原生逻辑,直接记录下用户点击的那个保存按钮,模态框确认后再模拟点击它:

// 全局变量存储触发提交的按钮
var targetSubmitBtn;

// 监听所有提交按钮的点击事件(而不是表单的submit事件)
django.jQuery('form').on('click', ':submit', function(event) {
    // 阻止按钮的默认提交行为
    event.preventDefault();
    // 记录下当前点击的按钮
    targetSubmitBtn = this;
    // 打开模态框
    modal.open();
});

// 模态框确认后的回调函数里执行提交
function confirmModal() {
    if (targetSubmitBtn) {
        // 模拟点击原按钮,这样会带上按钮的name和value参数
        django.jQuery(targetSubmitBtn).trigger('click');
        // 清空变量,避免重复提交
        targetSubmitBtn = null;
    }
}

方案二:保存按钮参数,添加隐藏字段后提交

如果模拟点击有兼容性问题,也可以把按钮的name和value存下来,模态框确认后添加到表单的隐藏字段再提交:

// 存储按钮的提交参数
var submitParams = {};

django.jQuery('form').on('click', ':submit', function(event) {
    event.preventDefault();
    // 记录按钮的name和value
    submitParams = {
        name: this.name,
        value: this.value
    };
    modal.open();
});

// 模态框确认提交
function confirmModal() {
    if (submitParams.name) {
        var $form = django.jQuery('form');
        // 先移除可能存在的同名隐藏字段,避免冲突
        $form.find('input[name="' + submitParams.name + '"]').remove();
        // 添加隐藏字段,把按钮的参数传递给后端
        $form.append(django.jQuery('<input>', {
            type: 'hidden',
            name: submitParams.name,
            value: submitParams.value
        }));
        // 提交表单
        $form.submit();
        // 清空参数
        submitParams = {};
    }
}

这两种方法都能完美保留Django Admin原生的保存选项功能,你可以根据自己的模态框逻辑选一个适配的就行。

内容的提问来源于stack exchange,提问作者rthill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:01