djangoでpandasを使いdfを作成し、テンプレート表示を行いました。
その表示されているdfをcsvで出力したいです。
mixins.py class ShopShiftWithScheduleMixin(WeekCalendarMixin): 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) print(b) 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) df.fillna(" ", inplace=True) 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
mixinで期間とユーザーを指定して、dfを返しています。
ここのdfをcsv出力したいです。
views.py class ShopShiftList(mixins.ShopShiftWithScheduleMixin, generic.TemplateView): model = Schedule template_name = 'shift/shopshift_list.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) calendar_context = self.get_week_calendar() context.update(calendar_context) return context
上記がdf表示のviewです。
html <table border="1"> <th>User</th> {% for day in df %} <th>{{day | date:"j" }}日<small>({{ day | date:"D" }})</small></th> {% endfor %} {% for index,row in df.iterrows %} <tr> <th>{{index}}</th> <td>{{row.0}}</td> <td>{{row.1}}</td> <td>{{row.2}}</td> <td>{{row.3}}</td> <td>{{row.4}}</td> <td>{{row.5}}</td> <td>{{row.6}}</td> <td>{{row.7}}</td> <td>{{row.8}}</td> <td>{{row.9}}</td> <td>{{row.10}}</td> <td>{{row.11}}</td> <td>{{row.12}}</td> <td>{{row.13}}</td> <td>{{row.14}}</td> {% if row.15 == True %} <td>{{row.15}}</td> {% else %} {% endif %} </tr> {% endfor %} </table> <form method="POST" > <button type="submit" class="btn btn-primary">csv</button>{% csrf_token %} </form>
to_csvで作成出来る事は分かったのですが、どういう記載にすればいいのか分かりません。
ボタンを押しPOSTされCSV作成と言う流れになると思うのですが、defで書く場所が
1.mixin.py内
2.viewsの上記class内
3.viewsの上記class外
どこに書けばいいのかもわかりません。
上記view内で
df=context['df']
df.to_csv('aaaaa.csv')
とした所、辞書はcsv出力できない、とエラーになりました。
よろしくお願いします。
あなたの回答
tips
プレビュー