Django JQuery Ajax文件上传

arn*_*rnm 22 django ajax jquery django-forms

我一直试图上传一个简单的文本文件几个小时,但我似乎仍然无法让它工作.

我一直收到无效的表格,说我错过了"file_source".

为什么"file_source"没有发布?

我也让它实际发送"file_source",但它仍然说它丢失了.应该为Django FileFiled提供什么类型的元素?

Django表格:

class FileUploadForm(forms.Form):
    file_source = forms.FileField()
Run Code Online (Sandbox Code Playgroud)

Django模板(渲染表格):

<form action="/upload/" method="post" id="file-upload-form" enctype="multipart/form-data"> {% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-primary" id='upload-btn'>Upload</button>
</form>
Run Code Online (Sandbox Code Playgroud)

JQuery/Ajax上传:

function uploadFile() {
$.ajax({
    data: $(this).serialize(),
    type: $(this).attr('method'),
    url: $(this).attr('action')
});
return false;
}

$(function() {
     $('#file-upload-form').submit(uploadFile);
});
Run Code Online (Sandbox Code Playgroud)

Django View哪收到POST:

def upload_view(request):
if request.is_ajax():
    form = FileUploadForm(request.POST)
    if form.is_valid():
        print 'valid form'
    else:
        print 'invalid form'
        print form.errors
return HttpResponseRedirect('/ingest/')
Run Code Online (Sandbox Code Playgroud)

arn*_*rnm 41

这是我改变它以使其工作.

  1. 我使用FormData打包表单中的数据

  2. 注意Django视图中表单的参数.我之前没有指定"文件",这就是导致"需要文件字段"错误的原因.

使用Javascript:

function upload(event) {
event.preventDefault();
var data = new FormData($('form').get(0));

$.ajax({
    url: $(this).attr('action'),
    type: $(this).attr('method'),
    data: data,
    cache: false,
    processData: false,
    contentType: false,
    success: function(data) {
        alert('success');
    }
});
return false;
}

$(function() {
    $('form').submit(upload);
});
Run Code Online (Sandbox Code Playgroud)

Django查看:

def upload_view(request):
    if request.method == 'POST':
        form = FileUploadForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            print 'valid form'
        else:
            print 'invalid form'
            print form.errors
    return HttpResponseRedirect('/ingest/')
Run Code Online (Sandbox Code Playgroud)

  • 我使用了您的代码,它收到403,因为缺少CSRF令牌.知道怎么解决吗? (2认同)