djangoを使ってcsvファイルをダウンロード出来るようには出来たのですが、場所のして方法が分かりません。
自分のみが使うのであれば別のディレクトリに保存する方法は分かるのですが、webアプリとしてブラウザから開いた場合にcsvを保存する場所を指定する方法はないでしょうか?
やりたいこと
・固定でデスクトップに保存する
・保存先指定のダイアログが出る
なんてことが出来ればと思っています。
それかダウンロードではなく、csvを起動する方法があればそこからユーザーが勝手に保存先を決められるのですが、何か良い方法はないでしょうか。
ちなみに出力はpandasのto_csvで行っています。
df.to_csv('a.cv')
調べたところあまりdjangoでpandasで出力している記事がなく(英語は分かりません)情報が少なく行き詰ってます。
よろしくお願いします。
追記
response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=a.csv' df.to_csv(path_or_buf=response,sep=';',float_format='%.2f',index=False,decimal=",")
上記試しましたが上手くいきませんでした。
mixins.pyでcsv出力をしています。(views.pyだと上手く行かなかった)
だから上手く行かないのでしょうか?
mixins.py class CsvMixin(Week_CsvMixin): def get_week_schedules(self, start, end, days): shop = get_object_or_404(Shops, pk=self.kwargs['shops_pk']) user= User.objects.filter(shops__shop=shop) b =[] for a in user: b.append(a) lookup = { '{}__range'.format(self.date_field): (start, end), } queryset = self.model.objects.filter(**lookup) days = {day: [] for day in days} df = pd.DataFrame(days) a=1 for schedule in queryset: if schedule.user in b: if a == 1: user=schedule.user.last_name+' '+schedule.user.first_name date= schedule.date start_time=schedule.get_start_time_display() end_time = schedule.get_end_time_display() time = start_time+'-'+end_time ddf =pd.DataFrame({date:time},index =[user]) df = pd.concat([df,ddf],axis=0) df.fillna(" ", inplace=True) a = 2 if user != schedule.user.last_name+' '+schedule.user.first_name: user=schedule.user.last_name+' '+schedule.user.first_name date= schedule.date start_time=schedule.get_start_time_display() end_time = schedule.get_end_time_display() time = start_time+'-'+end_time ddf =pd.DataFrame({date:time},index =[user]) df = pd.concat([df,ddf],axis=0) df.fillna(" ", inplace=True) else: user=schedule.user.last_name+' '+schedule.user.first_name date= schedule.date start_time=schedule.get_start_time_display() end_time = schedule.get_end_time_display() time = start_time+'-'+end_time ddf =pd.DataFrame({date:time},index =[user]) df[date]= df[date].astype(str) df.at[user,date] =time df.fillna(" ", inplace=True) # csv保存------------------- df.fillna(" ", inplace=True) today = datetime.datetime.today() day = today.strftime("%Y%m%d") # df.to_csv(day + '_list.csv',encoding= "utf_8_sig")←動作はするが、manage.pyと同じ場所に保存される ↓エラーは出ないが出力はされない response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=a.csv' df.to_csv(path_or_buf=response,sep=';',float_format='%.2f',index=False,decimal=",") return df def get_week_calendar(self): calendar_context = super().get_week_calendar() calendar_context['df'] = self.get_week_schedules( calendar_context['week_first'], calendar_context['week_last'], calendar_context['week_days'] ) return calendar_context
views.py class Shift_csv(mixins.CsvMixin, generic.TemplateView): model = Schedule template_name = 'shift/shift_csv.html' date_field = 'date' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) shop = get_object_or_404(Shops, pk=self.kwargs['shops_pk']) context['shops']= User.objects.filter(shops__shop=shop) context['shopnum']=self.kwargs['shops_pk'] calendar_context = self.get_week_calendar() context.update(calendar_context) return context
views.pyの書き方的に多分変なんだと思いますが、強引にやりました。
viewsでcsv出力のcodeを書くと上手く行きませんでした。
df =context['df'] df.to_csv('a.csv')
みたいに書きましたが上手く動作せず、結果mixinsで書く感じになってます。
出力されるならどこに書いてもいいんですが、、。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/18 16:14
2020/06/18 17:59 編集
2020/06/19 16:37
2020/06/19 21:22 編集
2020/06/19 21:26
2020/06/20 15:27
2020/06/20 15:41