Django边学边记——图片上传
Posted 不饶岁月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django边学边记——图片上传相关的知识,希望对你有一定的参考价值。
1.在python中进行图片操作,需要先安装包PIL
pip install Pillow
2.在settings.py配置图片路径
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media") #注意 这里是直接拼接的字符串不是列表,如果写成列表会报一个‘expected str, bytes or os.PathLike object, not list’的错误,这里可以不创建static和media文件夹,只要有图片上传djang会自动创建
3.创建包含图片的模型类
- 将模型类的属性定义成models.ImageField类型
class PicTest(models.Model): pic = models.ImageField(upload_to=\'test/\') #这里的pic实际上是一个test/后面再加上图片名的相对路径。也是就说数据库里只是存一个相对路径。这里的test/是相对于上面定义的MEDIA_ROOT的。ImageField继承自FileField,多了一个会对图片进行校验是否是图片的功能。
4.在Django中上传图片包括两种方式:
- 在管理页面admin中上传图片,直接进入后台管理页面点点点。。。
- 自定义form表单中上传图片
- 2种方式上传图片后,都是将图片存储在服务器上,然后将图片的路径存储在数据库表中
5.自定义带有form表单的html页面,上传图片
- 在模板中定义上传表单,必要要求如下:
- form的属性enctype="multipart/form-data"
- form的method为post
- input的类型为file
<html> <head> <title>自定义上传图片</title> </head> <body> <form method="post" action="/pic_upload/" enctype="multipart/form-data"> {%csrf_token%} <input type="file" name="pic"/><br> <input type="submit" value="上传"> </form> </body> </html>
6.创建视图pic_upload,用于接收表单保存图片
- request对象的FILES属性用于接收请求的文件,包括图片
-
from django.conf import settings from django.http import HttpResponse ... def pic_upload(request): pic =request.FILES.get(\'pic\') #默认情况下,如果上传的文件小于2.5兆,Django 将把文件的所有内容保存到内存里。大于2.5的放在临时文件里。 fname =\'%s/test/%s\'%(settings.MEDIA_ROOT,pic.name) #这里的pic对象 都有个.name 属性 还有类似的 .size with open(fname,\'w\') as f: for i in pic.chunks(): #这里使用 UploadedFile.chunks() 而不是 read() 是为了确保即使是大文件又不会将我们系统的内存占满。chunks每次返回一块内容 f.write(i) PicTest.objects.create(pic = f\'/test/{pic.name}\' #存进数据库 return HttpResponse(\'OK\')
以上是关于Django边学边记——图片上传的主要内容,如果未能解决你的问题,请参考以下文章