前端js如何构建下载请求url,后端django如何创建excel文件?
示例
js
downloadFunc(fieldsForm){
let fieldsParams = new URLSearchParams(fieldsForm)
let searchFormParams = new URLSearchParams(this.searchForm)
let url = `${this.axios.defaults.baseURL}/download?${searchFormParams}&${fieldsParams}&token=${this.token}`
window.open(url, '_blank')
}
django
def get_rename_dict(queryset, serializer_cls, extra_rename_dict=None):
rename_dict = {
field: queryset.model._meta.get_field(field).verbose_name
for field in serializer_cls.Meta.fields
if field in dir(queryset.model)
}
if extra_rename_dict is not None:
rename_dict.update(extra_rename_dict)
return rename_dict
def queryset_to_dataframe(queryset, serializer_cls, serializer_context=None, filterset_cls=None, filter_params=None, extra_rename_dict=None):
if serializer_context is None:
serializer_context = {}
if filter_params is None:
filter_params = {}
if filterset_cls is not None:
queryset = filterset_cls(
filter_params,
queryset
).qs
ser = serializer_cls(queryset, many=True, context=serializer_context)
df = pd.DataFrame(ser.data)
df.index += 1
rename_dict = get_rename_dict(queryset, serializer_cls, extra_rename_dict)
df = df.rename(columns=rename_dict)
return df
def queryset_to_excel_response(queryset,
serializer_cls,
serializer_context=None,
filterset_cls=None,
filter_params=None,
extra_rename_dict=None,
prev_name='导出结果'):
df = queryset_to_dataframe(queryset, serializer_cls, serializer_context, filterset_cls, filter_params, extra_rename_dict)
io = BytesIO()
df.to_excel(io)
res = HttpResponse(io.getvalue(), content_type='application/octet-stream; charset=UTF-8')
# filename如果有中文必需编码下,要不会造成下载失败
filename = f'{prev_name}_{get_now_time("%Y-%m-%d_%H_%M_%S")}.xlsx'.encode('utf8').decode('ISO-8859-1') # 为了保证中文名正常显示
res['Content-Disposition'] = f'attachment; filename={filename}'
return res
class DownloadUserView(APIView):
"""下载示例(用户)"""
def get(self, request):
res = queryset_to_excel_response(
UserInfoView.queryset,
serializer_cls=UserInfoSerializer,
serializer_context={'fields': request.GET.get('fields', []).split(',')},
filterset_cls=UserInfoFilterSet,
filter_params=request.GET,
extra_rename_dict={
'tab_page_name': '标签页',
'developer_name': '开发人',
'template_type_name': '模板类型',
},
prev_name='用户信息',
)
return res

浙公网安备 33010602011771号