一:問題
當開啟一個項目的時候,通常會遇到文件(圖片,音頻等)上傳的需要,最常見的比如圖片的上傳,用戶頭像,后台管理添加圖片,而圖片的在是數據庫中的存儲主要是以該文件的相對路徑,在django中可以使用media_url很好的管理上傳文件。
二:操作
1、配置MEDIA_URL
Settings.py中配置上傳信息
MEDIA_URL = '/media/'
# 設置上傳文件的路徑
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 指定根目錄
2、數據庫模型配置
在數據庫相關模型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) # 商品圖片
在修改數據庫之后需要進行遷移
python manage.py makemigrations
python manage.py migrate
3、路由的配置
使用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})
]
4、模板的配置
因為之前在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以正常顯示。
<img src="{{ MEDIA_URL }}{{ goods.gpic }}">
其中{{ goods.gpic }}為商品的路徑
而經渲染之后,在瀏覽器中就正常顯示為
<img src="/media/df_goods/image/2019/05/goods_detail.jpg">
也就是說MEDIA_ROOT在模板中顯示其實就是/media/
三:效果
1、上傳文件目錄
當第一次從上傳文件的時候會在項目路徑下生成一個media目錄,而之后每一次上傳,都會根據日期來生成新的子目錄或者直接添加到已存在的目錄
2、數據庫
在數據庫中存儲的是每一個文件的相對路徑,只跟字段的up_load屬性有關。
另外一旦文件目錄混亂,或者數據庫受損,就會造成文件不顯示的問題,所以添加一個默認的字段屬性default設置默認值是很有必要的。