django-文件上傳Media url的配置

一:問題

當開啓一個項目的時候,一般會遇到文件(圖片,音頻等)上傳的須要,最多見的好比圖片的上傳,用戶頭像,後臺管理添加圖片,而圖片的在是數據庫中的存儲主要是以該文件的相對路徑,在django中可使用media_url很好的管理上傳文件。前端

二:操做

一、配置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設置默認值是頗有必要的。

相關文章
相關標籤/搜索