Django項目中"expected str, bytes or os.PathLike object, not list"錯誤解決:

對於這個錯誤,也在於本身對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項目中的文件存儲系統。

固然,咱們也能夠不使用這個默認的存儲系統,本身寫一個,或者使用別人的,參考官網連接:自定義存儲系統

相關文章
相關標籤/搜索