首页 |  我的博客 |  查看该博主内容分类 | 

前端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
posted @ 2024-12-28 21:45  Z哎呀  阅读(15)  评论(0)    收藏  举报