對於這個錯誤,也在於本身對django基礎的掌握不是很牢固,忽略了MEDIA_ROOT的類型是string,而不是list。django
錯誤的寫法:框架
1 MEDIA_ROOT = [ 2 os.path.join(BASE_DIR, 'media'), 3 ]
正確的寫法:ide
1 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
正是由於上面錯誤的將media_root的數據類型寫錯,纔會致使了這麼一個錯誤。url
附上官方文檔:spa
1 MEDIA_ROOT¶ 2 Default: '' (Empty string) 3 4 Absolute filesystem path to the directory that will hold user-uploaded files. 5 6 Example: "/var/www/example.com/media/"
說了這麼多,MEDIA_ROOT的功能究竟是幹嗎用的呢,主要就是爲咱們上傳一些圖片、文件之類的資源提供了文件路徑的功能。具體的使用以下:設計
settings.pycode
1 # MEDIA配置 2 MEDIA_URL = '/media/' 3 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
models.pyorm
1 class Banner(models.Model): 2 """"輪播圖""" 3 title = models.CharField('標題', max_length=100) 4 image = models.ImageField('輪播圖', max_length=100, upload_to="banner/%Y/%m") # here, upload img 5 url = models.URLField('訪問地址', max_length=200) 6 index = models.IntegerField('順序', default=100) 7 add_time = models.DateTimeField('添加時間', default=datetime.datetime.now) 8 9 class Meta: 10 verbose_name = "輪播圖" 11 verbose_name_plural = verbose_name 12 13 def __str__(self): 14 return self.title
urls.pyblog
1 from django.urls import re_path 2 from django.views.static import serve 3 from django.conf import settings 4 5 6 urlpatterns = [ 7 ... ... 8 re_path('^media/(?P<path>.*)/$', serve, {"document_root": settings.MEDIA_ROOT}), 9 ] 10 11 12 # 或者另一種方法 13 from django.conf.urls.static import static 14 from django.views.static import serve 15 from django.conf import settings 16 17 ... 18 19 urlpatterns += static(settings.MEDIA_URL, document_root=MEDIA_ROOT)
圖片的上傳,咱們須要用到ImageField字段,並對其upload_to參數傳入一個路徑"banner/%Y/%m",這個路徑會自動拼接到MEDIA_ROOT後面,例如這樣:「/media/banner/12/04/xxx.jpg」。圖片
【注】:ImageField的使用須要Pillow的支持,因此須要:pip install Pillow
爲何
爲何upload_to可以將後面的相對路徑接到MEDIA_ROOT後面呢?這裏面設計django框架的一個設計---文件系統(FileSystemStorage),django默認在orm中使用ImageField或者FileField時中upload_to所指向的路徑將會被添加到MEDIA_ROOT後面,以在本地文件系統上造成將存儲上傳文件的位置。
這個upload_to有這麼一個做用:
This attribute provides a way of setting the upload directory and file name, and can be set in two ways. In both cases, the value is passed to the Storage.save() method. 中文:此屬性提供了設置上載目錄和文件名的方法,能夠經過兩種方式進行設置。 在這兩種狀況下,該值都將傳遞給Storage.save()方法。
具體咱們可參考以下:FileField字段
那麼它是怎麼生效的呢?在django中有一個global_settings.py文件,裏面有file文件系統存儲的默認設置,以下:
1 # Default file storage mechanism that holds media. 2 DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
從這裏咱們能看到django已經默認了一個文件存儲器來工做了,它會全局控制django項目中的文件存儲系統。
固然,咱們也能夠不使用這個默認的存儲系統,本身寫一個,或者使用別人的,參考官網連接:自定義存儲系統