通過一個示例的完整演示過程,來學習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<path>.*)',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中的圖片進行訪問效果一樣,如下:(通常我們不會以這種方式直接請求)