2013-04-04 11 views
5

Mam problem z przesyłaniem plików w moim projekcie django. Tak więc pytanie brzmi: jak mogę przekazać pliki do widoku django przez ajax jquery?Django plik jquery ajax upload

W tej chwili mam

skryptu:

<script type='text/javascript'> 
$(document).ready(function() { 
    var csrf_token = $('input[name="csrfmiddlewaretoken"]').val(); 
    $('#upload').click(function() { 
     $.ajax({ 
      csrfmiddlewaretoken: csrf_token, 
      type: 'POST', 
      url : '../ajax/upload_file/', 
      enctype: "multipart/form-data", 
      data : { 
       'file': $('#file').val() 
      }, 
      success: function(data) { 
       console.log(data) 
      } 
     }) 
    }) 
}) 
</script> 

szablonu:

<form method="" action="" name='upload_form' id='upload_form' >{% csrf_token %} 
    <input type='file' name='file' id='file' /> 
    <input type='button' value='Upload' id='upload'/> 
</form> 

i Widok:

@csrf_exempt 
@xhr_to_json 
def verifyFile(request): 
    if request.is_ajax(): 
     file = request.FILES['file'] 
     return {'message': file} 
    else: 
     return HttpResponseForbidden() 

teraz im coraz

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111,  in get_response 
response = callback(request, *callback_args, **callback_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py", line 77, in wrapped_view 
    return view_func(*args, **kwargs) 
File "/home/vova/git/LV- 083_LAMP.git/Testcase_Project/Testcase_Project/views/decorator.py", line 6, in wrapper 
    data = func(*args, **kwargs) 
    File "/home/vova/git/LV- 083_LAMP.git/Testcase_Project/Testcase_Project/views/testcase.py", line 96, in verifyFile 
    request.FILES['file'] 
    File "/usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py", line  258, in __getitem__ 
    raise MultiValueDictKeyError("Key %r not found in %r" % (key, self)) 
MultiValueDictKeyError: "Key 'file' not found in <MultiValueDict: {}>" 

jest to możliwe, aby to zrobić bez zewnętrznych bibliotek?

+1

próbowałeś 'file = plik request.FILES.get ('')' – catherine

+0

powrocie Object {wiadomość: null} – vovaminiof

+0

wartość jest przekazywana – vovaminiof

Odpowiedz

7

Spróbuj tego:

def upload(request): 
    id = request.POST['id'] 
    path = '/var/www/pictures/%s' % id 
    f = request.FILES['picture'] 
    destination = open(path, 'wb+') 
    for chunk in f.chunks(): 
    destination.write(chunk) 
    destination.close() 
    # return status to client 
    ... 

Można przeczytać cały poradnik tutaj: http://www.laurentluce.com/posts/upload-to-django-with-progress-bar-using-ajax-and-jquery/

+1

problem jest taki, że request.FILES jest pusty – vovaminiof

+0

thx za link :) – vovaminiof

1
@csrf_exempt 
@xhr_to_json 
def verifyFile(request): 
    if request.is_ajax(): 
     file = request.FILES['file'] 
     return HttpResponse(file) 
    else: 
     return HttpResponseForbidden() 

<form method="POST" action="" name='upload_form' id='upload_form' enctype="multipart/form-data"> 
    {% csrf_token %} 
    <input type='file' name='file' id='file' /> 
    <input type='button' value='Upload' id='upload'/> 
</form> 
+0

Brak wrócił do klienta – vovaminiof

+0

usunąć 'if request.is_ajax():' w twoim widoku i instrukcji else. przetestuj, czy ponownie wrócisz do Brak – catherine

+0

wypełnij również formularz w swoim szablonie, aby odczytać plik pass – catherine

0

// html

<form id = "form_id" method = "POST" action = "#" enctype="multipart/form-data"> {% csrf_token %} 
         {{modelform_filefield}} 
         <input type = "submit" value="Post"/> 
        </form> 

// kod JavaScript

<script> 
    $(function(){ 
    $("#form_id").submit(function(){ 
    var data = new FormData($('#form_id').get(0)); 
       $.ajax({ 
        type:"POST", 
        url: "your_upload_url", 
        data : data, 
        cache: false, 
        contentType: false, 
        processData: false, 
        success: function(data){ 
    alert('success'); 
        }, 
        failure: function(){ 
         $(this).addClass("error"); 
        } 
       }); 
       return false; 
    }); 
    }); 
</script> 

Spowoduje to wyodrębnienie plików i formularzy danych od końca klienta. Adres URL łączy się z widokami, w których przetwarzane i przechowywane są twoje pliki.

//views.py

def upload(request): 
    if request.is_ajax(): 
     form = <modelFormName>(request.POST, files=request.FILES) 
     if form.is_valid(): 
      form.save() 
      return HttpResponse("form saved") 
     else: 
      return HttpResponse("form invalid") 

    return HttpResponse("not a ajax request") 

To powinno załatwić sprawę