2013-04-04 11 views
5

Django projemde dosya yükleme ile ilgili bir sorunum var. Yani soru şudur: jQuery ajax aracılığıyla dosyaları nasıl django görünümüne geçirebilirim? Bu andaDjango ajax jquery dosya yükleme

Ben

senaryo vardır:

<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> 

şablonu:

<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> 

ve görünüm:

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

şimdi

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: {}>" 

alma harici kütüphaneleri olmadan bunu yapmak mümkün im?

+1

Eğer 'file = request.FILES.get ('dosyasını') denediniz hile yapmak gerekir' – catherine

+0

dönen Nesne {mesajı: null} – vovaminiof

+0

Değer – vovaminiof

cevap

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

İstemciye geri döndü – vovaminiof

+0

bunu kaldırmak 'if request.is_ajax():' görünümünüzde ve başka bir ifadede. Bir kez daha – catherine

+0

tekrar dönüşü test edin, aynı zamanda şablonunuzdaki formunuzu tamamlayın, böylece – catherine

0

// html

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

// javascript kodu

<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> 
:

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 
    ... 

Burada tam öğretici okuyabilir

Bu, dosyayı ayıklayıp istemci sonundan veri oluşturur. URL, dosyalarınızın işlendiği ve saklandığı görünümlere bağlanır.

//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") 

Bu