Django如何上传图片并对上传图片进行访问


通过一个示例的完整演示过程,来学习django如何上传图片,以及对于media文件夹中的上传图片进行请求:

1.配置settings.py

 MEDIA_URL = '/media/'

 MEDIA_ROOT = os.path.join(BASE_DIR,'media').replace('\\','/')       #用于存储和访问上传图片的根目录

2.配置urls.py

from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.views.static import serve

urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^',include('user.urls')),
url(r'media/(?P.*)',serve,{'document_root':settings.MEDIA_ROOT}), #如果需要访问上传图片,则需要配置此路由
]

3.定义models.py
from django.db import models

class Goods(models.Model):
name = models.CharField(max_length=20)
img = models.ImageField(upload_to='goods/',default='goods/default.jpg',null=True,blank=True)
# upload_to这个属性必须得有,后面是基于MEDIA_ROOT的相对路径,上传文件时,django会自动帮我们创建这一系列文件夹并存储文件

4.定义views.py
# 上传图片
def upload_pic(request):
return render(request,'user/upload_pic.html')

# 对上传图片进行处理
def handle_pic(request):
    if request.method == 'POST':
goods_name = request.POST.get('goods_name')
pic_obj = request.FILES.get('picture') # 得到的是一个图片对象

# 存储图片路径(并非图片文件)到数据库,并自动将图片资源存储到指定目录下
goods = Goods()
goods.name = goods_name
goods.img = pic_obj
goods.save()
return redirect('/show_pic/')
else:
return HttpResponse('上传图片失败')
# 对上传图片进行显示
def show_pic(request):
# 获取商品名goods001所对应的图片路径
goods1 = Goods.objects.get(name='goods001')
img = goods1.img
context = {'img':img}
return render(request,'user/show_pic.html',context)

5.定义上传页模板upload_pic.html以及上传页页面显示
5.1 upload_pic.html:

 #  表单中有提交文件的控件时,提交方式必须是post,并且需要设置enctype属性

5.2 上传页页面显示:

 6.上传文件后图片存储路径

 # media文件夹及其内部的文件夹和文件,均由django自动帮我们生成

 7.上传文件后数据库中的存储内容

 # 存储的是图片相对于media文件夹的相对路径,即models.py中定义的upload_to="goods/"+图片文件名 

8.访问media中上传过的图片

8.1 show_pic.html:

# 同静态文件/static/访问一样,/media/后面直接写上media文件夹下的文件名,就可以直接请求到上传图片资源


 8.2 页面显示


 # 在地址栏直接对media中的图片进行访问效果一样,如下:(通常我们不会以这种方式直接请求)