django 用imagefiled訪問圖片


使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM