Django - 使用基于 Pandas 和 Class 的视图创建可下载的 Excel 文件
Django - Create downloadable Excel file using Pandas & Class Based View
我对 Django 比较陌生,一直在寻找一种使用 Pandas 和 CBV 将我的 DataFrame 导出到 Excel 的方法。我找到了这个 :
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
我无法在 class 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
我对 Django 比较陌生,一直在寻找一种使用 Pandas 和 CBV 将我的 DataFrame 导出到 Excel 的方法。我找到了这个
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
我无法在 class 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