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">

 

posted @ 2019-10-22 21:26  一知.半解  阅读(252)  评论(0编辑  收藏  举报