如何构建 django ajax 模态弹出表单(带有服务器端表单)?

Posted

技术标签:

【中文标题】如何构建 django ajax 模态弹出表单(带有服务器端表单)?【英文标题】:How to build django ajax modal popup forms (with server side forms)? 【发布时间】:2014-07-02 03:51:29 【问题描述】:

有哪些好的现代模式或 django 应用程序可以处理出现在弹出窗口中的服务器端表单?我的意思是:

    用户操作触发模式弹出窗口。 表单是服务器生成的,按需加载的。 如果提交错误,服务器会生成一个新表单。 在成功的情况下,有一个钩子可以更新 DOM 元素(主页不会重新加载)。

假设 jquery 或 bootstrap 3 等常用库可用。 DRY 解决方案的加分点:我见过的大多数模式有点毛球,我研究过的 django ajax 助手不能很好地解决模态弹出窗口问题,或者根本没有。

【问题讨论】:

相关但不相同的问题***.com/questions/11944887/… 【参考方案1】:

我就是这样做的:

$(document).on('submit', 'div.modal-body form', function(e) 

    var form_el = $(this);

    e.preventDefault();
    $.ajax(
        type: $(this).attr('method'),
        url: $(this).attr('action'),
        data: $(this).serialize(),
        success: function (xhr, ajaxOptions, thrownError) 
            if ( $(xhr).find('.errorlist').length > 0 ) 

                form_el.parents('.modal-body').html(xhr);

             else 

                form_el.parents('.modal-body').html('<h4>Form was properly processed!</h4>');

            
        ,
        error: function (xhr, ajaxOptions, thrownError) 

            form_el.parents('.modal-body').html(xhr);
        
    );
);

所以基本上它的作用是:

监视整个文档以查找来自form 的提交事件 div.modal-body 内的元素(引导模式)。如果那个事件 火灾,然后它被捕获在这里。 我使用$(this)获取动作和方法,所以不需要硬编码 成功时,如果结果包含类errorlist,则表示发生了错误,因此我没有重定向,而是捕获它并更新表单以显示包含错误消息的表单。 否则,我会更新模式,说它能够正确提交。

【讨论】:

【参考方案2】:

这是一种使用纯 jquery 和引导样式的弹出窗口的方法: 见http://jsfiddle.net/brycenesbitt/afyY2/。真实应用中的触发器如下所示:

$('#edit_foo').on('click', function () 
    $.ajax(
        type: 'GET',
        url: '/ajax/fooForm/',
        ,
        success: function (data, textStatus, jqXHR) 
            $('#foo_modal').find('.modal-body').html(data);
            $('#foo_modal').modal('show');
        ,
    );
);

ajax 调用应返回必要的 html 格式(无 json)。

在提交时,您需要 hack,因为 jquery ajax 错误函数不会返回数据: 如果返回码为 204“无内容”,则清理并退出。 如果返回码为 200,则重新显示带有服务器端错误说明的表单。

另请参阅这个不错但代码繁重的实时表单验证:http://www.the-art-of-web.com/javascript/ajax-validate/ 和这个 django ajax 工具网格https://www.djangopackages.com/grids/g/ajax/,我不特别推荐这些。

【讨论】:

【参考方案3】:

https://www.djangopackages.com/grids/g/ajax/ 有一个 Django ajax 工具网格,您可以查看。

【讨论】:

以上是关于如何构建 django ajax 模态弹出表单(带有服务器端表单)?的主要内容,如果未能解决你的问题,请参考以下文章

用户更新表单后 Django 弹出消息(模态)

提交按钮不能在ajax生成的表的模态弹出视图中工作

magnific popup:以编程方式将内容从弹出表单更改为模态微调器,然后返回表单

Django - Ajax 注册

python测试开发django-121.bootstrap-table弹出模态框修表格数据提交

如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - Django/AJAX