12-上传图片
上传图片
在Django中上传图片包括两种方式:1、在站点管理页面中上传图片 2、自定义form表单中上传图片
上传图片后,将图片存储在项目静态文件中,然后将图片的路径存储在数据库表中。
1、创建图片上传后保存的目录
上传的图片也是属于静态文件,保存在static目录下media表示多媒体文件目录;Book表示区分那个应用上传的文件。图片上传后保存的路径:static/media/Book/
2、在settings中,配置图片上传后保存目录
#配置图片保存到的路径 MEDIA_ROOT = os.path.join(BASE_DIR,"static/media")
3、创建上传图片的模型类
1、定义图片保存的路径作为模型属性path 2、将模型类属性定义成models.ImageField类型
class PictureInfo(models.Model): #upload_to:表示图片上传到哪儿了 path = models.ImageField(upload_to="Book/") #修改表名 class Meta: db_table = "pictureinfo"
4、生成迁移
python manage.py makemigrations
5、执行迁移,把图片模型的表创建出来
python manage.py migrate
后台站点上传图片
1、在admin.py文件中注册图片上传的模型类
# 将上传图片的PictureInfo模型注册到后台站点 admin.site.register(PictureInfo)
进入站点即可以上传图片,图片上传存储在项目静态文件中,而图片的路径存储在数据库中。
自定义表单上传图片
1、表单的模板
form:post请求、enctype="multipart/form-data"
input: type为file
CSRF安全验证
<form action="/recv/" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="pic"> <br> <br> <input type="submit" value="上传"> </form>
2、正则匹配接收图片的urls
# 接收图片 path('recv/', views.recv),
3、处理的图片视图
requrst对象的files属性用于接收请求的文件
from django.conf import settings # 接收图片 def recv(request): # 从请求报文中获取图片的网络数据 picture = request.FILES.get('pic') # 获取图片名字 name = picture.name # 拼接图片保存在服务器路径 path = '%s/Book/%s'%(settings.MEDIA_ROOT, name) # 将图片网络数据写入到path with open(path, 'wb') as pic: # 遍历图片网络数据 for c in picture.chunks(): # 写入图片网络数据 pic.write(c) # 将图片路径写入到数据库 pictureinfo = PictureInfo() pictureinfo.path = 'Book/%s'%name #保存
pictureinfo.save() return HttpResponse('OK!')
展示上传的图片
1、匹配路由
# 展示图片 path(show/$, views.show),
2、视图
# 展示图片 def show(request): return render(request, 'Book/show.html')
3、模板
<img src="/static/media/Book/mm02.jpg" alt="mm02">