参考链接:https://www.cnblogs.com/dengnan/p/3990211.html
参考链接:https://www.cnblogs.com/wangcuican/p/13162660.html
我事先将数据保存到了localStorage中,点击下载按钮,将数据传到后端,获取完整的数据,返回给前端,前端通过js实现下载到execl中
- code.html
这里用的button按钮
<dev>
<button class="btn btn-warning " id="download">Download</button>
</dev>
<script>
// 下载execl
function exportCsv(obj){
//title ["","",""]
var title = obj.title;
//titleForKey ["","",""]
var titleForKey = obj.titleForKey;
var data = obj.data;
var str = [];
str.push(title.join(",")+"\n");
for(var i=0;i<data.length;i++){
var temp = [];
for(var j=0;j<titleForKey.length;j++){
temp.push(data[i][titleForKey[j]]);
}
str.push(temp.join(",")+"\n");
}
var uri = 'data:text/csv;charset=utf-8,' + encodeURIComponent(str.join(""));
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "注册码.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
$('#download').click(function () {
// 获取localStorage中存储的数据
var codeArry = localStorage.getItem("codeArry");
// 触发ajax
$.ajax({
url:'/v1/regcode/download/',
type:'post',
data:{
'codes':codeArry,
'csrfmiddlewaretoken': '{{ csrf_token }}'
},
success:function (data) {
if (data.code!=100){
window.alert(data.msg);
}else {
// 调用 exportCsv 方法
exportCsv({
title:['注册码','注册时间','有效期(天)', '关联应用'],
titleForKey:['regcode','createdate','validperiod','application'],
data:data.res
})
}
}
})
})
</script>
注意: exportCsv 中 title中的元素与titleForKey中的元素数量对应
- code.py
@login_required(login_url='searchhandle:login')
def download(request):
if request.method == 'POST':
data_dict = {}
codes = request.POST.get('codes')
codes = json.loads(codes)
print('codes:', codes)
print('type codes:', type(codes))
if not codes:
data_dict['msg'] = '请先生成注册码'
data_dict['code'] = 101
return JsonResponse(data_dict)
res = [ ]
code_objs = RegisterCode.objects.filter(regcode__in=codes).all()
print(code_objs)
for obj in code_objs:
code_dict = {}
code_dict['regcode'] = obj.regcode
code_dict['validperiod'] = obj.validperiod
code_dict['application'] = obj.application
createdate = obj.createdate
createdate = createdate.strftime('%Y-%m-%d')
code_dict['createdate'] = createdate
res.append(code_dict)
data_dict['msg'] = 'OK'
data_dict['code'] = 100
data_dict['res'] = res
return JsonResponse(data_dict)
注意: 后端返回给前端的 res 的数据格式是 [ {}, {}, {},... ], 并且 这个列表中字典里的数据是与 titileForKey 对应的