在django中使用ajax调用上传文件

时间:2015-11-21 07:53:15

标签: python ajax django upload

我在django中创建了表单上传文件。这是工作。但是当我在django文件中尝试使用ajax时,上传工作无效。

我的代码:

models.py

class Upload(models.Model):
   documents = models.FileField(upload_to=content_file_name)
   user = models.ForeignKey(User)

class Meta:
    app_label = 'documentapp'

forms.py:

from django import forms
class UploadForm(forms.Form):
    documents = forms.FileField()

HTML:

<input type="file" name="documents" id="documents" class="form-control" required="required""/>
 <input type="button" id="upload_file_button" required="required" value="Upload" onclick="UploadUserDocuments()"/>

ajax在同一个html文件中:

function UploadUserDocuments() {
    $.ajax({
        url: "/signup/upload/",
        type: "POST",
        data: {
           documents:$('education_documents').val(),     
        },
        success: function(response){
        }
    });
}

view.py

def upload(request):
context = RequestContext(request)
if request.method == 'POST':
    form = UploadForm(request.POST, request.FILES)
    if form.is_valid():
        handle_uploaded_file(request.FILES['file'])
    return HttpResponse('true')
else:
    return HttpResponse('GET')

handle_uplaoded_fiel.py

def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
    for chunk in f.chunks():
        destination.write(chunk)

2 个答案:

答案 0 :(得分:1)

HTML / JS存在一些问题。

  • HTML的第一行有required属性值的双重终止引号。

  • 您的UploadUserDocuments()函数执行以下操作:

    $('education_documents').val()

    尝试匹配诸如<education_documents>之类的元素,而不是通过其id(即使用#选择器)选择元素值的常用方法。

但是,使用JQuery执行文件上载更为复杂。这个答案有一些想法:How can I upload files asynchronously?

答案 1 :(得分:0)

您似乎没有发送csrf_token。您可以使用csrf_exempt装饰器来跳过它(不是真正推荐的)。

否则,您应该将{%csrf_token%}标记添加到模板中。它将使用CSRF令牌创建隐藏字段。您可以在official documentation中找到如何在AJAX中处理它的方法。

另外我很好奇为什么不从变量渲染表单,而是手动添加HTML - 但它与主题没有直接关系。

所以我要这样做: HTML:

<form id="upload_doc" action="/signup/upload/" method="post" enctype="multipart/form-data"> {% csrf_token %} 
   {{form}}
   <input type="submit" value="send">
</form>

另请参阅@Ben Rowland回复

的通知