Django常用-上传图片

在Django中上传图片包括两种方式

       在管理页面admin中上传图片

      自定义form表单中上传图片,上传图片后,将图片存储在服务器上,然后将图片的路径存储在表中。

使用模型处理上传文件:将属性定义成models.ImageField类型

如果属性类型为imageField需要安装Pilow

pip install Pillow

(1)  打开 应用/models.py文件,定义模型类PicTest。

class PicTest(models.Model):

    pic = models.ImageField(upload_to='booktest/')  #upload_to指定图片保存的路径

(2)  生成迁移,执行迁移

(3)  在static目录下创建media目录,再创建应用名称的目录,此例为booktest。

(4)  打开 项目/settings.py文件,设置图片保存路径。

因为图片也属于静态文件,所以保存到static目录下。

MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")

             在管理页面admin中上传图片

(1)  打开  应用/admin.py文件,注册PicTest。

from django.contrib import admin

from booktest.models import *

admin.site.register(PicTest)

(2) 注册管理员账户

python manage.py createsuperuser

(3)  运行服务器,输入如下网址。

http://127.0.0.1:8000/admin/

(4) 路径要选择当前项目static文件夹下图片

(5)回到数据库命令行,查询表pictest中的数据如下图:

(6)图片被保存到目录static/media/booktest/下,如下图:

                 自定义form表单中上传图片

(1)  打开  项目/views.py文件,创建视图pic_upload。

def pic_upload(request):

    return render(request,'booktest/pic_upload.html')

(2)  打开   项目/urls.py文件,配置url。

url(r'^pic_upload/$', views.pic_upload),

(3)  在templates/booktest/目录下创建模板pic_upload.html。

在模板中定义上传表单,要求如下:

       form的属性enctype="multipart/form-data"

       form的method为post

       input的类型为file

<form method="post" action="/pic_handle/" enctype="multipart/form-data" />

        {%csrf_token%}

        <input type="file" name="pic"/>

       <input type="submit" value="上传" />

</form>

(4)打开  项目/views.py文件,创建视图pic_handle,用于接收表单保存图片。

request对象的FILES属性用于接收请求的文件,包括图片。

from django.conf import settings

from django.http import HttpResponse

def pic_handle(request):

    f1 = request.FILES.get('pic')  # 从前端获取上传的图片   

    fname = '{}/booktest/{}'.format(settings.MEDIA_ROOT,f1.name)’ # 图片的完整路径

    with open(fname,'wb') as pic:# 文件操作

           for c in f1.chunks():# 因为图片存储的方式是二进制流,用f1.chunks()获取图片的字节

               pic.write(c)

    return HttpResponse('OK')

(5)  打开booktest/urls.py文件,配置url。

    url(r'^pic_handle/$', views.pic_handle),

(6)  运行服务器,在浏览器中输入如下网址:

http://127.0.0.1:8000/pic_upload/

这里只是完成图片上传的代码,如果需要保存数据到表中需要创建PicTest对象完成保存。

                      显示图片

(1)打开  应用/views.py文件,创建视图pic_show。

from booktest.models import PicTest

def pic_show(request):

    pic = PicTest.objects.get(pk=1)

    context={'pic':pic}

    return render(request,'booktest/pic_show.html',context)

(2)  打开  应用/urls.py文件,配置url。

    url(r'^pic_show/$', views.pic_show),

(3)  在templates/booktest/目录下创建模板pic_show.html。

    <img src="/static/media/{{pic.pic}}"/>

(4)运行服务器,在浏览器中输入如下网址:

http://127.0.0.1:8000/pic_show/

推荐阅读更多精彩内容