Django基础之文件上传
一、没有配置Media
avatar = models.FileField(upload_to='avatars/', default='/avatars/default.png') # 储存头像的models代码
Django实现:
- django会将文件对象下载到项目的根目录中avatars文件夹中(如果没有avatars文件夹,Django会自动创建)
- default的意思是是如果该用户没有头像,会默认去找avatars下的default.png
二、Media配置
首先django有两种静态文件:
- /static/ : js , css ,img
- /media/ : 用户上传文件
settings中配置Media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
获取用户上传头像
avatar_obj = request.FILES.get('avatar') user_obj = UserInfo.objects.create_user( username=user, password=pwd, email=email, avatar=avatar_obj, )
配置Media后的django实现:
会将文件对象下载到MEDIA_ROOT中avatars文件夹中(如果没有avatars文件夹,Django会自动创建),user_obj的avatar存的是文件路径。
三、Media配置之MEDIA_URL
配置MEDIA_URL是为了让客户端直接访问Media中的数据,类似于STATIC_URL
settings.py
MEDIA_URL = '/media/'
urls.py
from django.urls import path, re_path from django.views.static import serve from cnblog import settings urlpatterns = [ # media配置 re_path(r'media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}) # 主要以media开头,后面写什么都行 ]
注意:
更新上传了的文件:只是会更新数据库中那个字段保存的文件的路径,但是之前上传的文件是不会被自动删除的,需要我们自行再写逻辑来删除之前上传错的或者需要被覆盖的文件。还有就是如果上传的文件名称是相同的那么你会发现数据库中这个字段的路径后面的文件名称会出现一个乱起八糟的随机字符串,这是因为上传的文件名称冲突了,django为了解决这个冲突,给你改了一下你的文件名称。
obj = models.Book.objects.get(name='chao2') obj.img=file_obj obj.save() #下面的update方法是不能更新正确更新保存的文件路径的,除非我们自己手动拼接文件路径,然后img=路径来进行update更新 models.Book.objects.filter(name='chao2').update(img=file_obj)
例子:
读取上传的excel文件,进行批量创建用户
import xlrd
from web import models
def customer_import(request): if request.method == 'GET': return render(request, 'customer_import.html') context = {'status': True, 'msg': '导入成功'} try: customer_excel = request.FILES.get('customer_excel') """ 打开上传的Excel文件,并读取内容 注:打开本地文件时,可以使用:workbook = xlrd.open_workbook(filename='本地文件路径.xlsx') """ workbook = xlrd.open_workbook(file_contents=customer_excel.file.read()) # sheet = workbook.sheet_by_name('工作表1') sheet = workbook.sheet_by_index(0) row_map = { 0: {'text': '客户姓名', 'name': 'name'}, 1: {'text': '年龄', 'name': 'age'}, 2: {'text': '邮箱', 'name': 'email'}, 3: {'text': '公司', 'name': 'company'}, } object_list = [] for row_num in range(1, sheet.nrows): row = sheet.row(row_num) row_dict = {} for col_num, name_text in row_map.items(): row_dict[name_text['name']] = row[col_num].value object_list.append(models.Customer(**row_dict)) models.Customer.objects.bulk_create(object_list, batch_size=20) except Exception as e: context['status'] = False context['msg'] = '导入失败' return render(request, 'customer_import.html', context)