Django + Ajax |文件上传|服务器无法识别Ajax请求

时间:2014-04-09 17:44:23

标签: javascript jquery python ajax django

我正在尝试使用ajax with Django实现文件上传,但面临一些问题。

当用户在选择文件并提交表单后尝试上传文件时,根据我的理解,应使用POST方法将ajax请求发送到服务器,但在我的情况下为{{ 1}}正在向服务器发出请求,但服务器无法将其识别为ajax请求,浏览器被重定向到POST,此页面上的内容如下所示。

http://<server>:<port>/upload/

Django版本:1.6.2

Python版本:2.7.5

另外,在Django Development Server上进行测试。

views.py

{"status": "error", "result": "Something went wrong.Try Again !!"}

模板

def upload(request):
        logging.info('Inside upload view')
        response_data = {}
        if request.is_ajax():
                logging.info('Is_AJAX() returned True')
                form = UploaderForm(request.POST, request.FILES)

                if form.is_valid():
                        logging.info('Uploaded Data Validated')
                        upload = Upload( upload=request.FILES['upload'] )
                        upload.name = request.FILES['upload'].name
                        upload.save()
                        logging.info('Uploaded Data Saved in Database and link is %s' % upload.upload)

                        response_data['status'] = "success"
                        response_data['result'] = "Your file has been uploaded !!"
                        response_data['fileLink'] = "/%s" % upload.upload

                        return HttpResponse(json.dumps(response_data), content_type="application/json")

        response_data['status'] = "error"
        response_data['result'] = "Something went wrong.Try Again !!"

        return HttpResponse(json.dumps(response_data), content_type='application/json')

Javascript 1:

<form id="uploadForm" action="/upload/" method="post" enctype="multipart/form-data">
                {% csrf_token %}
<input id="fileInput" class="input-file" name="upload" type="file">
<input type="submit" value="Post Images/Files" />
</form>

Javascript 2

$('#uploadForm').submit(function(){

        var formData = new FormData($(this)[0]);
        $.ajax({
                url: '/upload/',
                type: 'POST',
                data: formData,
                async: false,
                success: function (data) {
                alert(data)
                },
                cache: false,
                contentType: false,
                processData: false
        });
        return false;
});

问题:

1)为什么Django无法识别ajax请求,var options = { url: '/upload/', type: "POST", error: function(response) { alert('Something went Wrong. Try Again'); }, success: function(response) { if ( response.status == 'success' ) { alert('success'); } } }; $('#uploadForm').ajaxSubmit(options); 的值始终为request.is_ajax()

2)即使服务器没有识别ajax请求,为什么我的浏览器会被重定向到另一个页面?

还有另一个类似问题here,但没有结果。

3 个答案:

答案 0 :(得分:4)

这对我有用。您需要jquery.form.js

$("#uploadForm").submit(function(event) {
    $(this).ajaxSubmit({
        url:'{% url upload_file %}',
        type: 'post',
        success: function(data) {
            console.log(data)
        },
        error: function(jqXHR, exception) {
            console.log("An error occurred while uploading your file!");
        }
    });
    return false;
});

这里有类似的问题here和答案。

答案 1 :(得分:2)

确保javascript代码阻止

$('#uploadForm').submit(function(){

    var formData = new FormData($(this)[0]);
    $.ajax({
            url: '/upload/',
            type: 'POST',
            data: formData,
            async: false,
            success: function (data) {
            alert(data)
            },
            cache: false,
            contentType: false,
            processData: false
    });
    return false;
});

在页面上的DOM中的 uploadForm html表单后加载。在您的情况下,您似乎尝试将提交处理程序与尚未加载的表单元素绑定,因此当您单击时,它会发送简单的 POST 请求。

答案 2 :(得分:-1)

1)为什么is_ajax()不起作用? 你是否包含了JQuery表单插件(jquery.form.js)? ajaxSubmit()需要该插件。

查看http://jquery.malsup.com/form/

如果已经完成,您可以查看HTTPRequest对象

Django文档说HttpRequest.is_ajax() 如果请求是通过XMLHttpRequest发出的,则返回True。如果你使用一些javascript库来发出ajax请求,你就不必为这件事烦恼了。您仍然可以验证“HTTP_X_REQUESTED_WITH”标头,看看Django是否收到了XMLHttpRequest

2)为什么页面重定向?

正如我上面所说,处理ajax请求及其回调需要JQuery表单插件。另外,对于ajaxSubmit(),你需要覆盖$(#uploadForm).submit()

 $('#uploadForm').submit( function (){
     $(this).ajaxSubmit(options);
 return false;
 });

希望这有用:)