2017-10-27 7 views
1

ダウンロード可能なCSVファイルにデータをエクスポートしようとしています。私のウェブサイト上で "エクスポート"ボタンをクリックすると、すべての時点で私は405という応答を得ます。 postメソッドは、期待通りに機能します。responseすべてのデータが表示されます。以下のフィルタリングのptocessも期待通りに機能します。ここで405 on djangoでCSVファイルをエクスポートする

は、ビュークラスである:

class ExportInvoicesToCsvView(View, IsSuperuserMixin): 
    http_method_names = ['post', 'get'] 

    def post(self, request, *args, **kwargs): 
     response = HttpResponse(content_type='text/csv') 
     response['Content-Disposition'] = (
      'attachment; filename=raport.csv' 
     ) 

     writer = csv.writer(response, delimiter=';') 

     filters = json.loads(self.request.body.decode('utf8')) 
     data = Data.objects.filter(filters) 

     writer.writerow([ 
      'data.a', 'data.b', 'data.c', 'data.d', 'data.e' 
     ]) 


     return response 

次のようにURLの設定は次のとおりです。

url(
     r'^invoices-csv/$', 
     ExportInvoicesToCsvView.as_view(), 
     name='invoices-csv' 
    ), 

とHTMLテンプレート:ここ

<a href="{% url 'accountant:bills:invoices-csv' %}" type="button" class="btn btn-sm btn-default" 
    ng-click="getSelected()"> 
    <i class="fa fa-files-o fa-2x pull-left"></i> 
    &nbsp;{% trans 'Exportuj do csv' %} 
</a> 

EDIT は、コンソールログです。

Method Not Allowed (GET): /accountant/bills/invoices-csv/ 
[27/Oct/2017 16:41:12] "GET /accountant/bills/invoices-csv/ HTTP/1.1" 405 0 
[27/Oct/2017 16:41:15] "POST /accountant/bills/invoices-csv/ HTTP/1.1" 200 0 

わかりましたように、使用される方法には問題があります。それにもかかわらず、私はpostメソッドに入り、私が望むデータを得ることができます。

答えて

1

あなたはhttp_method_namesを必要はありません。一般に、Djangoビューは、対応するメソッドがビュークラスに存在する場合にのみHTTP動詞のリクエストを処理します。だから、あなたのビューはpostというメソッドを持っているので、これはDjangoにこのビューがPOSTリクエストを処理することを伝えるのに十分です。

A 405応答手段Method Not Allowedを意味します。

テンプレートがPOSTリクエストを作成しているように見えません。 getSelected()の機能を見ることなく、私は確かに知ることができませんが、実際には作成していないと思います。POST; GETを作成しています。ビューにget()メソッドが実装されていないため、405の応答が表示されています。

次のことを試してみてください。

  • http_method_names
  • は、あなたが実際にあなたのテンプレートからPOSTリクエストを作っていることを確認してください削除(ネットワーク要求を検査するには、ブラウザの開発者向けツールを使用)。
+0

私は 'post'を' get'に変更しました。これは多かれ少なかれ動作し始めました(今度はPOSTで405となります)が、私はそのファイルをダウンロードすることになります。私はそれをさらに調査します。 – gonczor

+0

それはテンプレートから 'POST'リクエストをしていないという証拠です。あなたの ''タグはビュー( 'GET')への単なるリンクです。自問してみてください;なぜ私は 'POST'が必要なのでしょうか? – TeaPow

+0

これは、私が覚えている限り、サーバー上のデータを変更するためのものです。確かに、それはGETだけでなければなりません。 – gonczor

1

あなたのContent-Disposition定義のファイル名部分を引用符で囲む必要があると思います。これは:

response['Content-Disposition'] = (
     'attachment; filename=raport.csv' 
    ) 

これである必要があります:

response['Content-Disposition'] = (
     'attachment; filename="raport.csv"' 
    ) 
+1

私のコードに2つの問題があるようです。私は1つだけの答えを受け入れることができますが、それはまた助けたので、私はこれをupvoteを与えています。 – gonczor

関連する問題