【问题标题】:Issue with Django form when submitted using jQuery form plugin使用 jQuery 表单插件提交时出现 Django 表单问题
【发布时间】:2009-12-10 17:16:28
【问题描述】:

使用 jQuery 表单插件提交表单时,目标视图收到的请求与以标准方式(没有 javascript)提交表单时收到的请求不同,并且我的 Django 模板未按预期呈现。 当以标准方式提交时,模板会呈现表单错误(“form.[field_name].errors”),而通过 javascript 提交时不会。 使用 javascript 提交,我怎样才能获得允许呈现模板的请求,就像使用标准提交一样? 两种情况下收到的请求对象的代码和差异如下所示。

谢谢 七月

javascript代码:

var is_geocoded = false;
var interval;

$(function(){

    $("#submit").click(function() {  
        var options = { 
            beforeSubmit:  getPosition,  // pre-submit callback 
            success:       showResponse  // post-submit callback       
        }; 

        // bind form using 'ajaxForm' 
        $('#addresto').ajaxForm(options); 
    });  

});

function getPosition() {

    var geocoder =  new GClientGeocoder();
    var country = $("#id_country").val();
    var city = $("#id_city").val();
    var postal_code = $("#id_postal_code").val();
    var street_number = $("#id_street_number").val();
    var street = $("#id_street").val();
    var address = street_number+", "+street+", "+postal_code+", "+city+", "+country;

    geocoder.getLatLng( address, function(point) {

        if (point) {

            $("#id_latitude").val(point.lat())
            $("#id_longitude").val(point.lng())
            is_geocoded = true;
        } else {
            is_geocoded = true;
        }
    });

    interval = setInterval("doSubmit()", 500);

    return false;
}

function doSubmit() {

    if (is_geocoded) {
        $("#addresto").ajaxSubmit();
        clearInterval(interval);
    }
}

Django 模板代码:

<form id="addresto" action="" method="POST">

<p><label for="id_name">Name:</label>{{form.name.errors}} {{ form.name }} </p>
<p><label for="id_country">Country:</label>{{form.country.errors}} {{ form.country }} </p>

<!-- more stuff -->

<p style="clear: both;"><input type="Submit" id="submit" value="Submit" /></p>
</form>

以下是视图接收到的请求与标准提交和 javascript 提交的区别:

xxx@xxx:~$ diff javascript_submit standard_submit 
7c7
<  'CONTENT_TYPE': 'application/x-www-form-urlencoded; charset=UTF-8',
---
>  'CONTENT_TYPE': 'application/x-www-form-urlencoded',
24c24
<  'HTTP_ACCEPT': '*/*',
---
>  'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
28d27
<  'HTTP_CACHE_CONTROL': 'no-cache',
33d31
<  'HTTP_PRAGMA': 'no-cache',
36d33
<  'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',
70c67
<  'wsgi.input': <socket._fileobject object at 0x891d064>,
---
>  'wsgi.input': <socket._fileobject object at 0x898b09c>,

【问题讨论】:

    标签: jquery django forms request submit


    【解决方案1】:

    通过ajax提交时没有出现错误的原因是你没有刷新页面。

    您需要将 json 或 xml 传递回您的 javascript 并以这种方式将错误插入到页面中。

    您也可以只将表单呈现为 html 块并覆盖页面上的当前表单(但这有点复杂,效率不高)

    基本上我建议只使用 django 的 request.is_ajax() 方法来确定表单是否使用 ajax 提交,并为 ajax 请求返回 json

    【讨论】:

    • +1 虽然我个人更喜欢为 ajax 请求提供不同的 URL 命名空间,可能只需将 json 放在路径中的某个位置。
    • 感谢您的提示。由于我这里不需要ajax,所以我只使用javascript,这样我就不必改变我的看法了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2021-06-15
    • 2017-11-26
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多