django-文件上傳Media url的配置


一:問題

當開啟一個項目的時候,通常會遇到文件(圖片,音頻等)上傳的需要,最常見的比如圖片的上傳,用戶頭像,后台管理添加圖片,而圖片的在是數據庫中的存儲主要是以該文件的相對路徑,在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設置默認值是很有必要的。


免責聲明!

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



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