當開啓一個項目的時候,一般會遇到文件(圖片,音頻等)上傳的須要,最多見的好比圖片的上傳,用戶頭像,後臺管理添加圖片,而圖片的在是數據庫中的存儲主要是以該文件的相對路徑,在django中可使用media_url很好的管理上傳文件。前端
Settings.py中配置上傳信息python
MEDIA_URL = '/media/' # 設置上傳文件的路徑 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 指定根目錄
在數據庫相關模型models中寫上image字段其中的一些屬性能夠幫助更好的標記文件,更好的跟蹤文件上傳。
好比:%Y表明年,%m表明月,blank=True表明能夠爲空。當上傳文件時,表明上傳到image目錄下,以當前年月子目錄的文件夾中。數據庫
class GoodsInfo(models.Model): # 商品模型:gpic爲該商品的圖片在項目中存儲的相對路徑 gpic = models.ImageField(verbose_name="圖片路徑", default="image/default.png", upload_to='df_goods/image/%Y/%m', null=True, blank=True) # 商品圖片
在修改數據庫以後須要進行遷移django
python manage.py makemigrations python manage.py migrate
使用MEDIA_URL就須要從新添加一個新的路由來管理整個文件目錄,處理文件上傳
在路由系統url.py中添加相關的處理函數和路由瀏覽器
from django.views.static import serve # 上傳文件處理函數 from .settings import MEDIA_ROOT # 從配置中導入MEDIA_ROOT urlpatterns = [ url(r'^media/(?P<path>.*)$', serve, {"document_root":MEDIA_ROOT}) ]
由於以前在settings.py中直接進行了MEDIA_URL的相關配置,因此想在模板中使用{{MEDIA_URL}},就須要在setting.py中進行模板相關的配置,在「模板」的「context_processors」選項中添加django.template.context_processors.media。函數
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', # 下面爲添加 'django.template.context_processors.media', # 將media_url上傳文件路徑註冊到模板中 ], }, }, ]
經過以上步驟,基本上能夠在前端正常渲染出結果了,但還須要給圖片添加一個URL以正常顯示。url
<img src="{{ MEDIA_URL }}{{ goods.gpic }}"> 其中{{ goods.gpic }}爲商品的路徑
而經渲染以後,在瀏覽器中就正常顯示爲debug
<img src="/media/df_goods/image/2019/05/goods_detail.jpg">
也就是說MEDIA_ROOT在模板中顯示其實就是/media/code
當第一次從上傳文件的時候會在項目路徑下生成一個media目錄,而以後每一次上傳,都會根據日期來生成新的子目錄或者直接添加到已存在的目錄
blog
在數據庫中存儲的是每個文件的相對路徑,只跟字段的up_load屬性有關。
另一旦文件目錄混亂,或者數據庫受損,就會形成文件不顯示的問題,因此添加一個默認的字段屬性default設置默認值是頗有必要的。