使用Django使用Javascript而不是HTML Form通过POST发送文件

时间:2017-11-24 22:23:18

标签: javascript ajax django file upload

我将PDF文件保存在变量“报告”中。

我正在使用Django并希望使用POST将其传递给views.py文件中的函数 -

@xframe_options_exempt
@csrf_exempt
def process_report(request):
    if request.method == 'POST'
         report_file = request.FILES['docfile']
         ....
         return response

如何使用此文件发送ajax POST请求?文件类型是PDF。

之前我使用HTML表单来执行此操作,但我想使用javascript设置表单上传的样式。我尝试使用javascript设置按钮样式(根据上传的文件类型更改颜色和文本),但该文件不再能够通过POST请求传递。现在我只是将文件保存在一个javascript变量中,我试图通过POST传递它而不使用表单。我知道用文件预填充表格是不可能的。

我的旧代码:

<form id="boring" action="{% url "process_report" %}" method="post" 
    enctype="multipart/form-data">

        {% csrf_token %}
        {{ form.non_field_errors }}
        {{ form.docfile.label_tag }} {{ form.docfile.help_text }                
        {{ form.docfile.errors }}
        {{ form.docfile }}

    </form>

我一直在尝试用ajax

var formdata = new FormData(report);
    $.ajax({
      url: 'process_report',
      type: 'POST',
      processData: false,
      contentType: false,
      dataType : 'application/pdf',
      data: {
                'content': 'formdata',
                'csrfmiddlewaretoken': '{{ csrf_token }}',
             }

1 个答案:

答案 0 :(得分:0)

我解决了自己的问题。我最终决定使用xhr而不是ajax,但这里是ajax的答案。

首先,我正在错误地设置表单数据,因为它应该是

// Set up form data
var formData = new FormData();
formData.append("docfile", report)

其次,ajax必须更新

// Pass the form to views via POST
$.ajax({
    url: "{% url "process_report" %}",
    type: 'POST',
    data: formData,
    cache: false,
    processData: false, // essential
    contentType: false, // essential, application/pdf doesn't work. 
    enctype: 'multipart/form-data',

    // If sucess, download file
    success: function(data, status, xhr) {
          console.log(data;
    }
});