2016-07-08 9 views
0

辞書をcsvに変換して、その場でcsvファイルをダウンロードしようとしています。応答を返すと、httpresponseの行が表示されます。しかし、私はローカルマシンのCSVファイルにコンテンツをダウンロードしたい。http応答でcsvファイルがダウンロードされない

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として、私はstackoverflowの上で見た多くの異なった方法を試してみました。また、StringIOを使って試しました。誰も私が何をしたいのかとは思わない。誰かが私が間違っていることを説明することはできますか?ありがとう。

クロムデバッガでは、目的のCSV形式の適切な内容が表示されます。それは、コンピュータのウィンドウ/アクションへのダウンロードをポップアップしません。

ここで私はそれを引き起こしています。

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

これは致命的な建設のようだ:私はベースにあなたのコードを発見しているずさんなエラーがあります。この

$('#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

可能な複製(http://stackoverflow.com/questions/1156246/having-django-serve-downloadable-files)私はいつも、私はジャンゴを使用していたこの背中を達成 –

+0

リンクされた質問の答えのように、mimetypeを 'application/force-download'に設定します。 –

+0

djangoでmimetypeを使用することはできません。コンテンツタイプをapplication/force-downloadに設定しようとすると、ダウンロードは強制されません。また、これはベストプラクティスではないが、ハックのようなものに関するいくつかのコメントを見た。 –

答えて

0

を考えてはいけません。

  • あなたは同じキーを持つ多くの辞書を持っている場合は、なぜあなたは値のみが含まれ、各行について、そのリストを反復処理しますリストを使用していませんか?

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

  • キーが異なる場合:

    keys = data[0].keys()

    上記のコードは、あなたが期待する結果が得られません。リスト内の最初の辞書のキーのみを返します。あなたはそのリストを反復処理し、個別に各辞書からキーを収集し、または次のようrowsを構築する必要があり、次のいずれか

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

+0

私のデータは次のようになります。= {{'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) 
[Djangoはダウンロード可能なファイルを提供持っ]の
+0

には、適切なコンテンツであるCSV形式のコンテンツが表示されます。しかし、それはコンピュータのアクションに保存をポップアップされません。 –

+0

この解決策は途中では機能しませんでした。 –

関連する問題