上傳圖片實際上是 把圖片存在服務器的硬盤中,將圖片存儲的路徑存在數據庫中。
1 首先要配置文件上傳的路徑:
1.1 建立靜態文件目錄
在項目根目錄下 新建一個 static文件夾,下面再建立一個media文件夾,在media中建立一個與應用名相同的文件夾
static為靜態文件目錄,里面是各個引用的靜態文件,包括js css 圖片 等等
static下一般分為 js css media 等
js css 和media 下一般都根據應用去建立多個文件夾,不同應用去自己的文件夾中找
我的目錄是這樣的:
我的應用模塊是booktest
上傳的圖片都會保存到 static/media/booktest/中
1.2 配置靜態路徑
到項目下的settings.py文件中,配置靜態文件路徑
添加如下3個語句
1 # Static files (CSS, JavaScript, Images)
2 # https://docs.djangoproject.com/en/1.8/howto/static-files/
3
4 STATIC_URL = '/myStatic/'
5 STATICFILES_DIRS = [ 6 os.path.join(BASE_DIR,'static'), 7 ] 8 MEDIA_ROOT=os.path.join(BASE_DIR,'static/media')
BASE_DIR代表整個項目的根目錄
STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), ] 代表指定根目錄下的static目錄是靜態文件目錄
MEDIA_ROOT=os.path.join(BASE_DIR,'static/media') 代表上傳文件的目錄是static/media
STATIC_URL = '/myStatic/' 代表 我們在編程的時候,用到靜態路徑的時候 用/myStatic/ 來找到靜態文件的目錄
2 建立一個數據庫,用於存儲上傳的圖片存在服務器的哪個路徑下
在模型中建立圖片的模型類並遷移
#上傳圖片的模型類
class Pictures(models.Model): pic = models.ImageField(upload_to='booktest/') def __str__(self): return self.pic
遷移命令:
生成遷移文件: python manage.py makemigrations
執行遷移: python manage.py migrate
圖片的上傳:
1 用戶上傳圖片:
1 前端的form表單input上傳:
前端模板代碼:
1 <body>
2 <form action="/upload/" method="post" enctype="multipart/form-data" >
3 {% csrf_token %} 4 上傳: 5 <input type="file" name="picture">
6 <input type="submit" value="上傳">
7
8 </form>
9
10
11 </body>
2 url映射部分 省略......
3 視圖view的代碼:
1 # 上傳圖片
2 from django.conf import settings 3 from .models import Pictures 4 # 返回上傳圖片的頁面
5 def getUpload(request): 6 return render(request,'booktest/upload.html') 7
8 # 發來表單 實現上傳功能
9 def upload(request): 10 # 從請求當中 獲取文件對象
11 f1 = request.FILES.get('picture') 12 # 利用模型類 將圖片要存放的路徑存到數據庫中
13 p = Pictures() 14 p.pic = "booktest/" + f1.name 15 p.save() 16 # 在之前配好的靜態文件目錄static/media/booktest 下 新建一個空文件
17 # 然后我們循環把上傳的圖片寫入到新建文件當中
18 fname = settings.MEDIA_ROOT + "/booktest/" + f1.name 19 with open(fname,'wb') as pic: 20 for c in f1.chunks(): 21 pic.write(c) 22 return HttpResponse("上傳成功")
這個時候我們在前段上傳提交后,
在靜態文件夾下多了一個圖片文件
數據庫中插入了一條信息,存儲圖片存放路徑。
2 管理頁面上傳圖片
在前台申請 127.0.0.1:8000/admin登陸后 上傳圖片
1 首先在admin.py中注冊一下上傳圖片的模型類
1 from django.contrib import admin 2 from .models import Pictures 3 # Register your models here.
4 admin.site.register(Pictures)
2 登陸 xxxx:8000/admin/ 登陸后 看到我們的數據庫表,點開直接上傳就可以。
上傳之后我們就能發現 數據庫多了一條數據,本地靜態文件路徑也多了一個圖片。
創建管理賬戶的命令: python manage.py createsuperuser
圖片的顯示:
原理是從數據庫中取到路徑,然后再去路徑找文件,返回給前台模板
views視圖中的代碼:
1 # 顯示圖片
2 def show_pic(request): 3 pic_obj = Pictures.objects.get(id=1) 4 return render(request,'booktest/show_pic.html',{'pic_obj':pic_obj})
pic利用模型類取到id為1的圖片對象,把這個圖片對象送給模板
模板中代碼:
1 <body>
2 <h1>顯示圖片</h1>
3
4 <img src="/myStatic/media/{{ pic_obj.pic }}" alt="">
5 </body>
pic_obj.pic: 之前建立了模型類有一個pic屬性 是 ImageField類型,upload_to 指定了上傳文件的目錄
這里利用這個對象
django自動幫我們去靜態路徑下取到圖片對象 放到前台。