2013-12-09 7 views
5

Ottengo 2 date, data di inizio e di fine, tramite AJAX. Elaboro i dati in bianco e nero di quei 2 giorni, generi un rapporto e restituisco una risposta a Http. Il report PDF è ora salvato nella mia directory principale del progetto. Ora ricevo una risposta in AJAX. Quindi, ora come devo elaborare la risposta nella funzione di successo, inviata di nuovo dal sever e aprire un file PDF.come aprire un file PDF mentre si restituisce il file in AJAX richiesta risposta positiva

Grazie.

jQuery

$(function() { 
    $("#report_submit").click(function(){ 
     $.ajax({ 
     type : "POST", 
     url: "/reports/", 
     data : { 'start_date' : $("#startDate").val() , 'end_date' : $("#endDate").val() }, 
     success : function(result){ 

     }, 

     error : function(result){ 
     } 
    }); 

    }); 
}); 

Django codice della vista

def generate_report(request): 
    ctx = {} 

    if request.is_ajax(): 
     if request.POST.has_key('start_date'): 
      start_date = datetime.strptime(request.POST[ 'start_date'] , '%m/%d/%Y') 
      end_date = datetime.strptime(request.POST[ 'end_date'] , '%m/%d/%Y') 

      ...... 
      # PDF GENERATED in MAIN PROJECT DIRECTORY 

      with open(os.path.join(os.path.dirname(__file__),'../../../../gui','Report.pdf')) as pdf: 
       response = HttpResponse(pdf.read(), content_type='application/pdf') 
       response['Content-Disposition'] = 'inline;filename=Report.pdf' 

       return response # so, now when I send a response back, how should I process it in AJAX success function? 
      pdf.closed 


    return render(request, 'generate_report/reports.html', ctx) 

risposta

0

Questo problema è stato discusso nella seguente domanda ... Potrebbe essere necessario andare per il plugin jQuery per il download di file e per favore non dimenticare di impostare cookie nella risposta.

PDF file download through XHR Request

Potrebbe essere necessario aggiungere un file javascript per il download di file e utilizzare il codice seguente per generare la richiesta al server.

$.fileDownload(urlll,{ 
     successCallback: function (url)  
     {   
      //success code here 
     },  
     failCallback: function (html, url) 
     {  
      //error code here 
     } 
    }); 

E sul lato server durante l'aggiunta dell'intestazione ecc. Nella risposta, eseguire quanto segue nell'oggetto risposta. cioè

aResponse.addCookie(cookie); 

spero si riesce a risolvere il problema e può aiutare gli altri come pure .. "ciondolanti Pointer"

+0

Faccio è un colpo. – PythonEnthusiast

+0

non dovrebbe essere necessario scaricare il file. Basta reindirizzare il browser ad esso. Ricorda, ora che hai generato il file, è da qualche parte nel tuo file system e può essere recuperato tramite URL. Basta passare l'URL nella risposta e utilizzare JS per reindirizzare ad esso. Puoi persino, impostare un cookie per limitare l'accesso ad esso. – cstrutton

+0

Dovrei aggiungere il tuo codice sopra '$ .fileDownload' in funzione di successo dell'AJAX ?? – PythonEnthusiast

0

La soluzione più semplice sarebbe quella di chiamare in window.open(pdf_url) callback "successo", dove pdf_url è il collegamento al tuo rapporto pdf generato (che dovrai passare alla risposta).

1

Non provare a inviarlo nella risposta Ajax. Invece, avere l'immagine per generare un URL univoco per il PDF, quindi ottenere il JS per reindirizzare il browser a quella URL:

vista:

return HttpResponse(json.dumps({'url': my_url}) 

JS:

$.ajax({ 
    type : "POST", 
    dataType: "json", 
    url: "/reports/", 
    data : { 'start_date' : $("#startDate").val() , 'end_date' : $("#endDate").val() }, 
    success : function(result){ 
    var url = result['url']; 
    window.location = url; 
    }, 
+0

Generare un URL significa? Come posso generare un nuovo URL per ogni file? Ho il percorso dove viene salvato quel file. Questo ha lo scopo dell'URL? – PythonEnthusiast

+0

Il mio punto è che avrete bisogno di un URL per servire il PDF. È necessario un qualche tipo di identificatore univoco in modo che la vista di servizio possa identificarlo.Ricorda che il tuo sito web potrebbe potenzialmente servire più persone alla volta, quindi non puoi generare un solo PDF "nella directory principale": potrebbe facilmente essere sovrascritto da un'altra richiesta. –

+0

Ho capito il tuo punto, ma la mia domanda è ancora valida sul fatto che dovrei creare un URL per questo file PDF nel file urls.py? Stai parlando di servire i file statici? – PythonEnthusiast