【问题标题】:Django Jquery Form no AJAX requestDjango Jquery Form没有AJAX请求
【发布时间】:2013-12-23 11:04:27
【问题描述】:

在阅读了类似主题的其他问题后,我仍然不明白这段代码有什么问题。

我正在测试一个使用 Jquery Form 插件的代码。我在模板的视图中添加了一个调用,第一次显示它,以便用户可以选择文件并上传。但它从不发送 AJAX 请求,因此不执行视图中的代码部分。虽然这里没有显示,但确实调用了 jQuery 库和 jQueryForm 插件。

Template:
<form id="uploadForm"  method="post" enctype="multipart/form-data">
                            {% csrf_token %}
        <input id="fileInput" class="input-file" name="upload" type="file">
        {{ form.docfile }}
        <span class="upload-message"></span>
        <input type="submit" value="Upload" />
</form>
<script>
    var message = '';
    var options = {
        type: "POST",
        url: '/upload/file/',
        error: function(response) {
            message = '<span class="error">We\'re sorry, but something went wrong. Retry.</span>';
            $('.upload-message').html(message);
            $('fileInput').val('');
        },
        success: function(response) {
            message = '<span class="' + response.status + '">' + response.result + '</span> ';
            message = ( response.status == 'success' ) ? message + response.fileLink : message;
            $('.upload-message').html(message);
            $('fileInput').val('');
        }
    };
    $('#uploadForm').ajaxSubmit(options);
</script>

查看:

def upload(request):
    response_data = {}

    if request.method == 'POST':
        if request.is_ajax:
            form = UploaderForm(request.POST, request.FILES)

            if form.is_valid():
                upload = Upload(
                upload=request.FILES['upload']
            )
            upload.name = request.FILES['upload'].name
            upload.save()

            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'] = "We're sorry, but kk something went wrong. Please be sure that your file respects the upload conditions."

        return HttpResponse(json.dumps(response_data), content_type='application/json')
    else:
        form = UploaderForm()
        return render(request, 'upload.html', {'form': form})

第一次调用模板正确,显示按钮,再次执行脚本但表单无效,所以response_data有错误。

我错过了什么?

谢谢,里卡多

【问题讨论】:

  • 那么在点击“提交”之后,ajax 根本不运行?
  • 如果您的脚本中没有数据发送,它应该如何工作??
  • 嗨,Ricardo,你解决了这个问题吗?我面临同样的问题。需要帮助!

标签: ajax django jquery-forms-plugin


【解决方案1】:

您可以尝试使用API section 中的示例,只需查看源代码:

$('#uploadForm').ajaxForm({
    beforeSubmit: function(a,f,o) {
        $('.upload-message').html('Submitting...');
    },
    success: function(data) {
        $('.upload-message').html('Done!');
    }
});

和 HTML:

<form id="uploadForm" action="/upload/file/" method="post" enctype="multipart/form-data">
                        {% csrf_token %}
    <input type="hidden" name="MAX_FILE_SIZE" value="100000">
    File: <input type="file" name="file">
    {{ form.docfile }}
    <span class="upload-message"></span>
    <input type="submit" value="Upload" />
</form>

【讨论】:

  • 我想我应该使用数组作为文件值,对吧?我怎么能做到?同样对于表单,我应该通过 $('#uploadForm') 吗?
【解决方案2】:

如果脚本中没有发送表单数据,它应该如何工作。

var options = {
    type: "POST",
    url: '/upload/file/',
    data: new FormData(document.getElementById('uploadForm')),
    processData: false,
    contentType: false,
    error: function(response) {
        message = '<span class="error">We\'re sorry, but something went wrong. Retry.</span>';
        $('.upload-message').html(message);
        $('fileInput').val('');
    },
    success: function(response) {
        message = '<span class="' + response.status + '">' + response.result + '</span> ';
        message = ( response.status == 'success' ) ? message + response.fileLink : message;
        $('.upload-message').html(message);
        $('fileInput').val('');
    }
};

【讨论】:

  • 谢谢凯瑟琳。我以为“$('#uploadForm').ajaxSubmit(options);”这行会这样做。尽管如此,添加 3 行(带有 data、processData 和 contentType)后,视图无法将请求识别为 AJAX 并提供错误。
【解决方案3】:

你的观点至少有一个问题——这个:

if not request.GET:
    return render(request, 'upload.html') 

request.GET 为空时将阻止进一步执行执行 POST 请求时就是这种情况

【讨论】:

  • 谢谢布鲁诺。我放了 if 语句,因为视图将请求评估为不是 AJAX 并跳转到错误消息并返回。
  • 我很困惑如果原始视图代码没有在任何地方调用它,那么 HTML 文件将被调用。我只是对其进行测试,以便稍后根据需要进行调整。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2021-05-03
  • 2010-11-05
  • 2016-06-18
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多