django边学边做:用Django3创建一个图片网站,实现多张图片上传、显示并删除图片(二、多张图片上传、显示、删除)

一、上传单张图片(views.upload_image、uploadImage.html、配置url)  

  1.配置url

  myImageSite/urls.py:

  

1 from django.contrib import admin
2 from django.urls import path
3 from imageSite import views
4 urlpatterns = [
5     path(admin/, admin.site.urls),
6     path(uploadImage/, views.upload_image),# 地址为uploadImage/,对应函数为upload_image
7 
8 ]

  2.上传图片对应的templates/uploadImage.html:

1 <body>
2 <h1>上传图片</h1>
3     <form method="post" action="/uploadImage/" enctype="multipart/form-data">
4         {% csrf_token %}
5         <input type="file" name="upload_img">
6         <input type="submit" name="上传图片">
7     </form>
8 </body>

  3.上传图片对应函数imageSite/views.py: 

 1 from django.shortcuts import render, redirect,HttpResponse
 2 from imageSite.models import Images
 3 
 4 
 5 def upload_image(request):
 6     """
 7     上传图片函数
 8     :param request:
 9     :return:
10     """
11     # print(request.method)
12     img = request.FILES.get(upload_img) # 取得uploadImage.html form表单中的upload_img
13     new_img = Images(images=img) # 添加数据(表imageSite_images中添加一条数据:字段id自增,字段images=img)
14     new_img.save() # 保存后才能写入数据库
15     return render(request, "uploadImage.html")

    这里不选择任何图片直接提交也会在数据库中插入id自增,images为空白的数据,暂时还没解决

    因为在setting.py中设置了MEDIA_ROOT=BASE_DIR/‘static‘,在model.py的Images类中设置了上传路径upload_to="media"

    上传的图片存在static目录下的media文件夹里。

    在数据库中发现所有images字段的数据前面都带了上传路径media都是由“media/文件名”组成的.

    以后要通过绝对路径操作文件就可以通过MEDIA_ROOT/images字段读取到文件

 

二、显示所有图片(views.show_images、showImages.html、配置url) 

  1.配置url

 

  myImageSite/urls.py:

  path(‘showImages/‘, views.show_images), # 地址为showImages/,对应函数为show_images

  2.对应的html(templates/showImages.html)  

 1 <body>
 2     <h1>显示所有图片</h1>
 3     <table border="1">
 4     <thead>
 5         <tr>
 6             <th>ID</th>
 7             <th>图片</th>
 8         </tr>
 9     </thead>
10     <tbody>
11         {% for img_name in img_list %} 
12             <!-- img_list:对应函数show_images的image_list传递参数给img_list-->
13              <tr>
14                 <td>{{img_name.id}}</td>
15                  <!--循环遍历img_list,取所有id作为一列-->
16                 <td><img src="{{ "/static/"}}{{img_name.images}}"/></td>
17                  <!--循环遍历img_list,取所有images作为图片地址的一部分-->
18             </tr>
19         {% endfor %}
20      </tbody>

  3.对应函数imageSite/views.py: 

 

 1 def show_images(request):
 2     """
 3     显示所有图片
 4     :param request:
 5     :return:
 6     """
 7     image_list = Images.objects.all()  # 取得所有的Images对象
 8     print(type(image_list))
 9     return render(request, "showImages.html",
10                   {"img_list": image_list})  
11     # {"img_list": image_list}将所有Images对象传递到showImages.html的img_list中

三、增加删除图片操作

  1.配置url

  myImageSite/urls.py:

   path(‘deleteImage/‘, views.delete_image),

  2.对应html(在原showImages.html中加入)

  templates/showImages.html:

    <td><a href="/deleteImage/?deleteID={{ img_name.id }}">删除</a></td>

 1 <tbody>
 2         {% for img_name in img_list %}
 3             <!-- img_list:对应函数show_images的image_list传递参数给img_list-->
 4              <tr>
 5                 <td>{{img_name.id}}</td>
 6                  <!--循环遍历img_list,取所有id作为一列-->
 7                 <td><img src="{{ "/static/"}}{{img_name.images}}"/></td>
 8                  <!--循环遍历img_list,取所有images作为图片地址的一部分-->
 9                 <td><a href="/deleteImage/?deleteID={{ img_name.id }}">删除</a></td>
10                  <!--通过url传递参数到deleteID获得要删除的图片的id(img_name.id)
11                  相当于字典{deleteID:img_name.id},
12                  在views函数中用request.GET.get("deleteID")取得对应的img_name.id
13                  -->
14             </tr>
15         {% endfor %}
16      </tbody>

 

  3.对应的函数(delete_image和remove_file)

  imageSite/views.py:

    3.1 remove_file(name)函数:

 1 def remove_file(name):
 2     """
 3     删除指定name的本地文件
 4     :param name: 图片在数据库中的images字段
 5     :return: 
 6     """
 7     from myImageSite.settings import MEDIA_ROOT # 从settings.py中导入默认路径(static文件夹的路径)
 8     import os
 9     path = MEDIA_ROOT/name # 取得文件的绝对路径(static目录/name)
10     os.remove(path)  # 删除文件

    3.2 delete_image函数

 1 def delete_image(request):
 2     """
 3     删除数据库中对应id的数据
 4     :param request:
 5     :return:
 6     """
 7     delete_id = request.GET.get("deleteID")  # 取得要删除的图片id
 8     delete_object = Images.objects.filter(id=delete_id)
 9     # 取得字段id=delete_id的对象合集
10     # 用objects.filter取得的是对象的合集,只不过经过id=delete_id限定这个合集只有一个对象,
11     # 类似于长度为1的列表,可以用索引delete_object[0]来取值

delete_image_name = delete_object[0].images # 取得要删除数据对应的images字段,也就是本地图片的名称
remove_file("%s"%delete_image_name) # 删除本地文件,要把delete_image_name作为字符串给remove_file当参数
    #要先删本地文件再删数据库行,否则会查不到delete_image_name
12     delete_object[0].delete()  # 删除数据库对应行
13     return redirect("/showImages/")  # 删除后再跳转到showImages

  delete_image函数只能删除数据库中内容,不能删掉本地文件,所以要先删除文件再删除数据。还没学会直接删除的方法

四、一次上传多张图片

  1.修改uploadImage.html:

    <input type="file" name="upload_img"> 这一行改为<input type="file" name="upload_img"multiple="">在上传时就可以按住shift选中多张图片

  2.修改imageSite/views.py的upload_image函数

    

 1 def upload_image(request):
 2     """
 3     上传图片函数
 4     :param request:
 5     :return:
 6     """
 7     # print(request.method)
 8     # img = request.FILES.get(‘upload_img‘)  # 取得uploadImage.html form表单中的upload_img
 9     # new_img = Images(images=img)  # 添加数据(表imageSite_images中添加一条数据:字段id自增,字段images=img)
10     # new_img.save()  # 保存后才能写入数据库
11     # 上传单张图片

12 # 上传多张 13 imgs = request.FILES.getlist("upload_img") 14 for imgs_images in imgs: 15 new_img = Images(images=imgs_images) 16 new_img.save() 17 return render(request, "uploadImage.html")

 

 

    

django边学边做:用Django3创建一个图片网站,实现多张图片上传、显示并删除图片(二、多张图片上传、显示、删除)

上一篇:jQuery中的动画与ajax的应用


下一篇:django基础之DRF初始化 urls设置(4)