2013-12-09 15 views
5

Tôi nhận được 2 ngày, ngày bắt đầu và ngày kết thúc, thông qua AJAX. Tôi xử lý dữ liệu b/w 2 ngày đó, tạo một báo cáo và sau đó trả về một HttpResponse. Báo cáo PDF hiện được lưu trong thư mục dự án chính của tôi. Bây giờ tôi nhận được phản hồi trong AJAX. Vì vậy, bây giờ làm thế nào tôi nên xử lý các phản ứng trong chức năng thành công, gửi trở lại từ sever và mở một tập tin PDF.cách mở tệp PDF trong khi trả lại tệp theo yêu cầu thành công AJAX

Cảm ơn.

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){ 
     } 
    }); 

    }); 
}); 

xem mã Django

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) 

Trả lời

0

Vấn đề này đã được thảo luận trong câu hỏi sau đây ... Bạn có thể cần phải đi cho các plugin jquery cho tập tin tải về và xin đừng quên đặt cookie trong phản hồi.

PDF file download through XHR Request

Bạn có thể cần phải thêm một tập tin javascript cho các tập tin tải về và cũng sử dụng mã folowing để tạo ra các yêu cầu đến máy chủ.

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

Và ở phía máy chủ trong khi thêm tiêu đề vv vào phản hồi, hãy làm như sau trong đối tượng phản hồi. tức là

aResponse.addCookie(cookie); 

Tôi hy vọng bạn có thể giải quyết vấn đề này và có thể giúp đỡ người khác cũng .. "Dangling Pointer"

+0

Để tôi cho nó một shot. – PythonEnthusiast

+0

bạn không cần phải tải xuống tệp. Chỉ cần chuyển hướng trình duyệt đến nó. Hãy nhớ rằng, bây giờ bạn đã tạo tệp, nó nằm đâu đó trên hệ thống tệp của bạn và có thể được truy xuất qua URL. Chỉ cần chuyển URL trở lại trong phản hồi và sử dụng JS để chuyển hướng tới nó. Thậm chí bạn có thể đặt cookie để hạn chế quyền truy cập vào nó. – cstrutton

+0

Tôi có nên thêm mã ở trên '$ .fileDownload' dưới chức năng thành công của AJAX không ?? – PythonEnthusiast

0

Giải pháp đơn giản nhất sẽ được gọi window.open(pdf_url) trong "thành công" gọi lại, nơi pdf_url là liên kết vào báo cáo pdf được tạo của bạn (bạn sẽ cần phải chuyển sang phản hồi).

1

Đừng cố gắng gửi nó trong phản hồi Ajax. Thay vào đó, có được cái nhìn của bạn để tạo ra một URL duy nhất cho PDF, sau đó nhận được JS để chuyển hướng trình duyệt tới URL:

xem:

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

Tạo url có nghĩa là gì? Làm cách nào để tạo một url mới cho mỗi tệp? Tôi có đường dẫn đến nơi tập tin đó được lưu. Điều đó có phục vụ mục đích url không? – PythonEnthusiast

+0

Điểm của tôi là bạn sẽ cần một URL để phục vụ PDF từ đó. Bạn cần một số loại số nhận dạng duy nhất để chế độ xem phân phát có thể nhận dạng nó.Hãy nhớ rằng trang web của bạn có khả năng sẽ phục vụ nhiều người cùng một lúc, do đó bạn không thể chỉ tạo một tệp PDF "trong thư mục chính": nó có thể dễ dàng bị ghi đè bởi một yêu cầu khác. –

+0

Tôi nhận được quan điểm của bạn, nhưng câu hỏi của tôi vẫn là viết cách tôi tạo một url cho tệp PDF này trong tệp urls.py? Bạn đang nói về việc phục vụ các tệp tĩnh? – PythonEnthusiast

Các vấn đề liên quan