前端重要代碼
<div class="row"> <div> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file_obj"> <!-- <input type="text" name="project_pk" hidden value="{{ project_pk }}"> --> <input type="submit" value="提交"> </form> <span style="color: red">{{ error }}</span> </div> </div> {% endblock %}
重點是form表前要有enctype="multipart/form-data"
字段標識,不然Django后台無法識別這個是文件類型的數據;上傳文件的input字段的type類型要是file類型。
再來看views視圖處理:
from django.shortcuts import render, redirect, HttpResponse from django.db import transaction def import_case(request, pk): """ 導入Excel數據,pk是所屬項目的pk """ if request.method == 'POST': try: with transaction.atomic(): # 事物 # project_pk = request.POST.get("project_pk") # 數據庫使用字段 excel = request.FILES.get('file_obj') book = xlrd.open_workbook(filename=None, file_contents=excel.read()) sheet = book.sheet_by_index(0) title = sheet.row_values(0) for row in range(1, sheet.nrows): print(sheet.row_values(row)) # 這里取出來每行的數據,就可以寫入到數據庫了 return HttpResponse('OK') except Exception as e: print(e) return render(request, 'import_case.html', {"project_pk": pk, "error": "上傳文件類型有誤,只支持 xls 和 xlsx 格式的 Excel文檔"}) return render(request, 'import_case.html', {"project_pk": pk, "error": ""})
see also:Django上傳並讀取Excel