django后台数据批量导入
开发环境:win10+python3.6+django2.0
大致思路:客户端下载excel模板,按照模板填写数据,填写完之后上传,批量导入
为了确保数据能够上传成功,我们需要让客户端按照我们的格式来进行填写,避免字段不同 上传数据不成功,所以先要让客户下载模板,然后导入
这里使用的是django的excel包,还有其他的可以使用,比如:xlrd,有时间再写xlrd文档
具体步骤:
-
安装依赖
-
配置环境
-
注册视图
-
配置url
-
测试
1、安装依赖
pip3 install django-excel
pip3 install pyexcel-xls
pip3 install pyexcel-xlsx
2、配置环境
在项目setting.py中配置环境 这里配置的是我们文件上传下载需要的
FILE_UPLOAD_HANDLERS = (
"django_excel.ExcelMemoryFileUploadHandler",
"django_excel.TemporaryExcelFileUploadHandler",
)
3、注册视图
这是项目文件夹下面的view.py文件,你需要在哪里 使用就把文件放在哪个视图就行
from django.http import HttpResponseBadRequest
from django.views.generic import View
from django import forms
import django_excel as excel
#这是验证from提交的表单
class UploadFileForm(forms.Form):
file = forms.FileField()
#这是测试文件上传
class TestDjangoExcelUpload(View):
"""测试使用django-excel上传文件"""
#如果是get请求就执行这里
def get(self,request):
form = UploadFileForm()
return render(request,'upload_form.html',context={ 'form': form })
#如果是post请求就之执行这里
def post(self,request):
#获取我们上传的文件
form = UploadFileForm(request.POST, request.FILES)
#验证文件
if form.is_valid():
filehandle = request.FILES['file']
# return excel.make_response(filehandle.get_sheet(), "xlsx")
#如果验证成功 返回给前端
return HttpResponse({'msg':'成功'},filehandle)
else:
return HttpResponseBadRequest()
#测试文件下载
class TestDjangoExcelDownload(View):
"""测试使用django-excel下载文件"""
def get(self,*args,**kwargs):
sheet = excel.pe.Sheet([['姓名', '班级','年级','身份证号']])
return excel.make_response(sheet, "xlsx")
def uploadGrade(request):
'''
班级信息导入
:param request:
:return:
'''
if request.method == 'POST':
f = request.FILES.get('file')
excel_type = f.name.split('.')[1]
if excel_type in ['xlsx','xls']:
# 开始解析上传的excel表格
wb = xlrd.open_workbook(filename=None,file_contents=f.read())
table = wb.sheets()[0]
rows = table.nrows # 总行数
try:
with transaction.atomic(): # 控制数据库事务交易
for i in range(1,rows):
rowVlaues = table.row_values(i)
print(rowVlaues[0])
print(rowVlaues[1])
print(rowVlaues[2])
print(rowVlaues[3])
# u_id_number = StudentsCost.objects.filter(rowVlaues[3])
# if u_id_number:
StudentsCost.objects.create(name=rowVlaues[0],grade=rowVlaues[1],the_class=rowVlaues[2],id_number=rowVlaues[3])
except:
logger.error('解析excel文件或者数据插入错误')
return render(request,'t2.html',{'message':'导入成功'})
else:
logger.error('上传文件类型错误!')
return render(request,'t1.html',{'message':'导入失败'})
from xadmin.views import CommAdminView
class TestView(CommAdminView):
def get(self, request):
context = super().get_context() # 这一步是关键,必须super一下继承CommAdminView里面的context,不然侧栏没有对应数据
title = "学生表" #定义面包屑变量
context["title"] = title #把面包屑变量添加到context里面
return render(request, 'excel.html', context) #最后指定自定义的template模板,并返回context
class DownloadView(CommAdminView):
"""测试使用django-excel下载文件"""
def get(self,*args,**kwargs):
sheet = excel.pe.Sheet([['姓名', '班级','年级','身份证号']])
return excel.make_response(sheet, "xlsx")
4、url配置
我这里演示是配置在项目url下面
url('xadmin/upload/uploadGrade', views.uploadGrade),