2012-05-21 21 views
5

Sử dụng Django, tôi muốn tạo một số dữ liệu có sẵn để tải xuống.tạo một tệp với django để tải xuống bằng javascript/jQuery

gọi jQuery của tôi trông như thế này cho đến nay:

$.getJSON("/get_data", 
      { users: users, study: "{{study.id}}" } , 
      function(json){ 
       alert('some data!'); 
      } 
); 

Điều này đòi hỏi một quan điểm Django của tôi, do đó tạo ra một số JSON và cố gắng để làm cho điều đó JSON văn bản trong một tập tin để tải

jsonResponse = json.dumps(data, cls=DjangoJSONEncoder) 

jsonFile = cStringIO.StringIO() 
jsonFile.write(jsonResponse) 

response = HttpResponse(jsonFile, mimetype='application/json') 
response['Content-Disposition'] = 'attachment; filename=data.txt' 

return response 

Tuy nhiên, điều này không hoạt động. Sau khi nhìn xung quanh một thời gian, tôi tin rằng tôi nên thay đổi một cái gì đó trên cả hai đầu - Javascript và mã python/Django - nhưng tôi không rõ chính xác những gì. Đối với Python, mối quan tâm chính của tôi là sử dụng cStringIO (đặc biệt là thực tế là tôi không thể thực hiện đóng trên jsonFile trước khi trở về mà không nhắc một "ValueError: I/O hoạt động trên tập tin đóng").

Có lẽ tôi cũng nên sử dụng một FileWrapper (như trong số này post), nhưng tôi nhận được kết quả giống hệt nhau có và không có nó.

Đối với Javascript, tôi không chắc chắn những gì nên đi vào chức năng xử lý thành công của tôi.

Mọi con trỏ sẽ được đánh giá cao!

+0

Bạn muốn có người dùng nhìn thấy một hộp thoại tập tin tải về (tiết kiệm, chạy hủy) hoặc chỉ muốn gửi dữ liệu JSON để sử dụng javascript? – xbtsw

+0

Trước đây - Tôi muốn tạo hộp thoại trình duyệt "lưu" xuất hiện (trong đó, từ sự hiểu biết của tôi, nên xảy ra với tiêu đề "Nội dung Bố trí", đúng không?) – arturomp

+0

@amp, buộc phải có _download_ như trái ngược với hiển thị trong trình duyệt. Việc buộc một tệp lưu không phải là thứ chúng tôi có thể làm ... ví dụ: tôi có tất cả các tài nguyên đã tải xuống sẽ chuyển thẳng đến thư mục tải xuống của tôi. Các tìm kiếm của Google hiển thị các câu lệnh tương tự ... –

Trả lời

7

Giải pháp cổ điển cho việc này là sử dụng một ẩn iframe.

Trong urls.py

url(r'^test/getFile', 'getFile') 

Trong bạn views.py

def getFile(request): 
    fileContent = "Your name is %s" % request.GET['name'] 
    res = HttpResponse(fileContent) 
    res['Content-Disposition'] = 'attachment; filename=yourname.txt' 
    return res 

Trên trang của bạn

<script type="text/javascript"> 
    var data = {name: 'Jon'}; 
    $(function(){ 
     $("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>'); 
    }); 
</script> 
Các vấn đề liên quan