对于这个错误,也在于自己对django基础的掌握不是很牢固,忽略了MEDIA_ROOT的类型是string,而不是list。

错误的写法:

 MEDIA_ROOT = [
os.path.join(BASE_DIR, 'media'),
]

正确的写法

 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

正是因为上面错误的将media_root的数据类型写错,才会导致了这么一个错误。

附上官方文档:

 MEDIA_ROOT¶
Default: '' (Empty string) Absolute filesystem path to the directory that will hold user-uploaded files. Example: "/var/www/example.com/media/"

说了这么多,MEDIA_ROOT的功能到底是干嘛用的呢,主要就是为我们上传一些图片、文件之类的资源提供了文件路径的功能。具体的使用如下:

settings.py

 # MEDIA配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

models.py

 class Banner(models.Model):
""""轮播图"""
title = models.CharField('标题', max_length=100)
image = models.ImageField('轮播图', max_length=100, upload_to="banner/%Y/%m") # here, upload img
url = models.URLField('访问地址', max_length=200)
index = models.IntegerField('顺序', default=100)
add_time = models.DateTimeField('添加时间', default=datetime.datetime.now) class Meta:
verbose_name = "轮播图"
verbose_name_plural = verbose_name def __str__(self):
return self.title

urls.py

 from django.urls import re_path
from django.views.static import serve
from django.conf import settings urlpatterns = [
... ...
re_path('^media/(?P<path>.*)/$', serve, {"document_root": settings.MEDIA_ROOT}),
] # 或者另外一种方法
from django.conf.urls.static import static
from django.views.static import serve
from django.conf import settings ... 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文件系统存储的默认设置,如下:

 # Default file storage mechanism that holds media.
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

从这里我们能看到django已经默认了一个文件存储器来工作了,它会全局控制django项目中的文件存储系统。

当然,我们也可以不使用这个默认的存储系统,自己写一个,或者使用别人的,参考官网链接:自定义存储系统

Django项目中"expected str, bytes or os.PathLike object, not list"错误解决:的更多相关文章

  1. django项目中遇到要实现定时任务

    django项目中遇到要实现定时任务,所以选用了简单易用的django-crontab插件. 1.安装 django-crontab pip install django-crontab 2.定时要执 ...

  2. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  3. [翻译]在Django项目中添加谷歌统计(Google Analytics)

    原文:<Google Analytics tracking code into Django projects, the easy way> 对我来说,制作一个可扩展的Django应用随时 ...

  4. Django项目中使用Redis

    Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...

  5. 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!

    擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...

  6. django 项目中使用多数据库 multiple databases

    假如在一个django项目中使用到了不只一个数据库, 其实这在大一点的工程中很常见,比如主从库 那么会涉及到如下一些东西 1, 定义 在settings中的DATABASE中定义会使用到的数据,比如除 ...

  7. django 项目中的 favicon.ico 处理

    django 项目中的 favicon.ico 处理  (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...

  8. Django项目中模板标签及模板的继承与引用【网站中快速布置广告】

    Django项目中模板标签及模板的继承与引用 常见模板标签 {% static %} {% for x in range(x) %}{% endfor %} 循环的序号{% forloop %} 循环 ...

  9. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

随机推荐

  1. Uva1608

    如果一个序列的所有子序列中均存在至少一个元素,这个元素在该子序列中只出现一次,则这个序列non-boring. 当一个序列[x,y]中没有元素只出现一次,那么该序列不符合要求,如果有的话,设为第i个元 ...

  2. 【转】grunt动态生成文件名

    动态生成文件名 expand 设置为true打开以下选项 cwd 所有src指定的文件相对于这个属性指定的路径 src 要匹配的路径,相对与cwd dest 生成的目标路径前缀 ext 替换所有生成的 ...

  3. HDU 5908 Abelian Period 可以直接用multiset

    http://acm.hdu.edu.cn/showproblem.php?pid=5908 要求把数组分成k组使得每组中的元素出现次数相同 就是分成k个集合,那么直接用multiset判定就可以 有 ...

  4. Java ping 主机 端口

    22:04:08.002 [main] INFO Ping - 目标地址 192.168.1.107 是否可到达:true 22:04:08.006 [main] INFO Ping - 执行命令 p ...

  5. Java日志格式应该是占位符还是字符串拼接

    背景 ​ 上次在群中,有个群友说自己把所有项目中,所有使用占位符打印日志的方式都修改成为了字符串拼接的方式,因为他曾经看了一篇文章,说字符串拼接的形式比占位符形式的性能更好,这个话题引起了大家的广泛讨 ...

  6. IIS下FTP服务器的PASV端口范围修改方法

    应该有不少使用IIS自带的FTP服务器,IIS的FTP里的PASV模式下默认端口范围1024 - 65535,连接时会从中随机选择到响应.这样的超大范围就给服务器安全带来的隐患. 虽然可以通过一些方法 ...

  7. android 开发-Process and Thread

    目录 1 android中进程与线程 - Processes and Threads 1.1 进程 - Processes 1.1.1 进程的生命期 1.2 线程 - Threads 1.2.1 工作 ...

  8. Mybatis与Ibatis的区别

    Mybatis与Ibatis的区别: 1.Mybatis实现了接口绑定,使用更加方便 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口 ...

  9. GCC的内存边界对齐

      GCC有三种影响内存对齐的开关:           首先是命令行参数 –fpack_struct=n (n只可以是1,2,4,8等2的幂,而且要小于平台默认的对齐字节数,否则不会生效)      ...

  10. Servlet的生命周期以及线程安全问题

    一:Servlet生命周期图,以及注意事项 二:代码演示 LifeCycleServlet.java package cn.woo.servlet; import java.io.IOExceptio ...