Django - Создание загружаемого файла Excel с помощью Pandas и представления на основе классов

Я относительно новичок в Django и искал способ экспорта DataFrame в Excel с помощью Pandas и CBV. Я нашел следующее code:

from django.http import HttpResponse

def my_view(request):
    # your pandas code here to grab the data
    response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename="foo.xls"'
    return response

Это идеально подходит для модели FBV, но как я могу настроить его, чтобы передать его в get_context_data? Вот мой код:

class ResultView(TemplateView):
    template_name = 'tool/result.html'

    # def get(self, request, *args, **kwargs):

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        user = self.request.user
        context['result'] = self.request.session['result']
        result = context['result']

        # Transformation into DF
        df = pd.DataFrame(result) #to be transformed into Excel File
        # pprint(df)

        # Count number of rows
        nb_rows = df[df.columns[0]].count()
        context['nb_rows'] = nb_rows

        # Count number of rows which are errored
        nb_errors = np.sum(df['IsSimilar'] == True)
        context['nb_errors'] = nb_errors

        # Sum all rows
        total_amount = df['Montant_HT'].sum()
        context['total_amount'] = total_amount

        # Sum all rows which are errored
        rows_errors_sum = df.loc[df['IsSimilar'] == True, ['Result']].sum().values
        rows_errors_sum = str(rows_errors_sum).replace('[', '').replace(']', '')
        rows_errors_sum = float(rows_errors_sum)
        context['rows_errors_sum'] = rows_errors_sum


        return context

У меня не получается сделать запрос внутри моего класса ResultView. Не могли бы вы помочь мне с этим?

Наконец, мне удалось это сделать, создав еще одно представление с именем DownloadView и переопределив метод get. Вот код:


class ResultView(TemplateView):
    template_name = 'tool/result.html'



    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        user = self.request.user
        context['result'] = self.request.session['result']
        result = context['result']

        # Transformation into DF
        df = pd.DataFrame(result)
        # pprint(df)

        # Count number of rows
        nb_rows = df[df.columns[0]].count()
        context['nb_rows'] = nb_rows

        # Count number of rows which are errored
        nb_errors = np.sum(df['IsSimilar'] == True)
        context['nb_errors'] = nb_errors

        # Sum all rows
        total_amount = df['Montant_HT'].sum()
        context['total_amount'] = total_amount

        # Sum all rows which are errored
        rows_errors_sum = df.loc[df['IsSimilar'] == True, ['Result']].sum().values
        rows_errors_sum = str(rows_errors_sum).replace('[', '').replace(']', '')
        rows_errors_sum = float(rows_errors_sum)
        context['rows_errors_sum'] = rows_errors_sum

        return context

class DownloadView(TemplateView):
    template_name = 'tool/download.html'

    def get(self, request, *args, **kwargs):
        content = self.request.session['result']
        df = pd.DataFrame(content)

        with BytesIO() as b:
            writer = pd.ExcelWriter(b, engine='xlsxwriter')
            df.to_excel(writer, sheet_name='Sheet1', index=False)
            writer.save()
            filename = 'Rapport'
            content_type = 'application/vnd.ms-excel'
            response = HttpResponse(b.getvalue(), content_type=content_type)
            response['Content-Disposition'] = 'attachment; filename="' + filename + '.xlsx"'
            return response


Вернуться на верх