2016-07-08 58 views
0

我試圖將字典轉換爲csv,然後即時下載csv文件。當我返回響應時,我看到了httpresponse中的行。但我希望它將內容下載到本地計算機的csv文件中。csv文件無法通過http響應下載

def export_csv_from_dict(data): 
    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="accounts.csv"' 

    keys = data[0].keys() 
    dict_writer = csv.DictWriter(response, keys) 
    dict_writer.writeheader() 
    dict_writer.writerows(data) 

    return response 

def accounts_function(request): 
    # rows is a list of dictionary [{'name': 'a'}, {'name': 'b'}] 
    rows = get_rows_data(matched_accounts) 
    return data.export_csv_from_dict(rows) 

我已經嘗試了許多不同的方法,我就看到了計算器,如filewrapper,使用FileResponse,使用寫入臨時文件,並返回filewrapper它。還嘗試使用StringIO。沒有人似乎在做我想要發生的事情。有人可以解釋我做錯了什麼,請。謝謝。

在Chrome調試器中,我看到所需csv格式的正確內容。它不會彈出下載到電腦窗口/動作。

現在我正在觸發它。不要以爲這

$('#exp_csv').click(function(){ 
     $.ajax({ 
      'url': '/targeturl/', 
      'type': 'get', 
      data: { 
       'exp_csv': true, 
       'search_string': search 
      }, 
      success: function(response){ 
       // do something 
      }, 
      error: function(){ 
       // do something else 
      } 
     }) 
    }); 
+0

[在Django的服務下載的文件]中可能的複製(http://stackoverflow.com/questions/1156246/having-django-serve-downloadable-files) –

+0

我總是完成,當我使用Django此回通過設置mimetype爲'application/force-download'就像鏈接問題的答案一樣。 –

+0

無法在django中使用mimetype,並且當我嘗試將內容類型設置爲application/force-download時,它不會強制下載它。我還看到一些關於這不是最佳做法的評論,但有點像黑客。 –

回答

0

有一個草率的錯誤我已經在基地發現你的代碼:

# rows is a list of dictionary [{'name': 'a'}, {'name': 'b'}]

這似乎是一個致命的建設。

  • 如果您有許多字典具有相同的密鑰,爲什麼不使用只包含值並且遍歷每行的列表的列表?

    rows = ['a', 'b',]

  • 如果密鑰是不同的:

    keys = data[0].keys()

    上面的代碼不會給你你所期望的結果。它只會返回列表中第一個字典的鍵。您應該通過列表迭代並單獨收集每個字典的關鍵,或構建rows如下:

    rows = [{'name1': 'a', 'name2': 'b'},]

+0

所以我的數據就像這樣rows = [{'firstname':'john','lastname':'doe'},{'firstname':'jane','lastname':'doe'},],我正在寫一個本地的csv文件,這工作正常。這只是我無法弄清楚如何將該臨時csv文件從服務器下載到本地計算機。 –

+0

您應該提供有關您收到的結果的更多信息。 – raratiru

1

您是否嘗試過使用簡單的硬編碼行的數據?下面的代碼基於你的例子應該很好。如果它起作用,那麼在動態填充行數據時一定會有問題,這需要您提供一些關於get_rows_data函數如何工作的額外信息。

def export_csv_from_dict(self, data): 
    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"' 

    fieldnames = data[0].keys() 
    writer = csv.DictWriter(response, fieldnames=fieldnames) 

    writer.writeheader() 
    writer.writerows(data) 
    return response 

def accounts_function(self, request): 
    rows = [{'first_name': 'Baked', 'last_name': 'Beans'}, 
      {'first_name': 'Lovely', 'last_name': 'Spam'}, 
      {'first_name': 'Wonderful', 'last_name': 'Spam'}] 
    return self.export_csv_from_dict(rows) 
+0

在chrome調試器中顯示正確的內容,csv格式的內容。但它不會彈出一個保存到電腦的行動。 –

+0

該解決方案無法順利運行。 –