使用FileField和ImageField時,我們有幾個步驟:
- 在settings.py中設置MEDIA_ROOT和MEDIA_URL
-
- MEDIA_ROOT:一個絕對路徑,Django根據它知道文件要上傳到哪里
- MEDIA_URL:一個公共URL,用來與MEDIA_ROOT對應(不是要相同,而是相關聯)
- 在FileField或ImageField中指定upload_to參數,用來指定文件要被上傳到MEDIA_ROOT下的哪個子目錄
logo = ImageField(upload_to='images/logos')
圖片就會被上傳到MEDIA_ROOT下的images/logos目錄下
如果要訪問圖片,還需要設置urls
DIRNAME = os.path.dirname(__file__) urlpatterns += patterns("", (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(DIRNAME, "media"), 'show_indexes': True }), )
這么設置的前提是要在settings設置MEDIA_URL='/media/'
這樣以/media/開頭的URL就會被導向
django.views.static.serve了,同時從數據庫拿出來的url也會自動在前面加上/media/
FileField 和 FieldFile
當在一個model上訪問一個FileField(ImageField繼承自FileField,所以也適用)時,我們可以得到一個FieldFile實例,作為我們訪問底層文件(即真實的那個文件)的
代理(proxy)。之所以被稱為代理,是因為它具有幾個
屬性和方法,方便我們與具體的文件數據進行交互
- FieldFile.url:返回一個只讀的、用於訪問文件的相對路徑URL,這是通過訪問底層的Storage類的url(name)方法實現的
- FieldFile.open(mode='rb'):完全類似於python的open(),打開與當前實例相關聯的文件,打開模式由mode參數指定
- FieldFile.close():類似於python的close()方法
- FieldFile.save(name,content,save=True):手動地將一個文件內容關聯到該Field,name是調用后文件的名稱,content是要關聯的文件的內容,save表示該實例是否在調用完成后就執行保存到數據庫。
- 注:這里的content必須是一個django.core.files.File的實例,而不是python內置的file對象,但是可以通過用python內置的open方法獲得file對象后構造一個File實例
- FieldFile.delete(save=True):刪除關聯的文件。
- 注:當model實例被刪除的時候,對應的文件不會被自動刪除,需要我們手動刪除,或執行一條項目管理命令,比如cron
File Storage
Django將決定文件存儲在哪里的權利委托給一個
文件存儲系統(file storage system)對象。
Django默認的文件存儲系統由settings中的
DEFUALT_FILE_STORAGE指定,如果我們在編程過程中不顯式地指定
我們可以編寫定制的文件存儲系統,當我們不想使用系統默認的storage時,比如我們想把文件保存在一個遠程系統中
在FileField和ImageField中,可以用storage參數指定要使用的storage system