You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django提交表单时报错[Errno 30]只读文件系统'/media'如何解决?

Django Media目录上传报错问题解决

问题原因

  • MEDIA_ROOT配置与实际项目结构不匹配:当前配置的存储路径为BASE_DIR/staticfiles/media_root,但实际media目录位于项目根目录与manage.py同级,Django尝试写入不存在的路径时会触发权限报错。
  • 模型文件字段配置错误:如果Mots模型的FileField/ImageField的upload_to参数以斜杠开头,会被识别为系统绝对路径,直接指向系统根目录的/media路径,该路径默认对普通进程只读,就会触发你看到的报错。
  • 开发环境未配置media路由或生产环境反向代理配置错误,也可能导致路径解析异常。

解决方案

1. 修正settings.py配置

将MEDIA_ROOT修改为对应实际media目录的路径:

# settings.py 替换原有MEDIA_ROOT配置
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

2. 检查模型字段配置

打开models.py,确认Mots模型的image字段upload_to参数没有以斜杠开头:

# 错误写法(会指向系统根目录/media)
image = models.FileField(upload_to="/media/")

# 正确写法(路径相对于MEDIA_ROOT,最终存储到项目根目录/media/imgs下)
image = models.FileField(upload_to="imgs/")
# 若无需子目录,可直接写 upload_to=""

3. 开发环境补充路由配置

如果是本地runserver启动的开发环境,在主urls.py中添加media路径映射:

from django.conf import settings
from django.conf.urls.static import static

# 原有urlpatterns定义
urlpatterns = [
    # 你的其他路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

4. 生产环境权限配置

如果是线上部署环境,不要使用777权限,将media目录的所属权改为运行Django进程的用户即可:

# 示例:假设运行Django的用户为www-data,项目根目录为/opt/my_project
sudo chown -R www-data:www-data /opt/my_project/media
sudo chmod -R 755 /opt/my_project/media

内容的提问来源于stack exchange,提问作者Cyril

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:06:04