如何使用Django表单存储图片?配置后图片未存入media目录
Django上传图片不生效、media目录不生成问题修复
你踩的都是Django文件上传的新手常见坑,按以下步骤逐一排查修复即可:
- 首先明确:Django不会自动创建最外层的media根目录,你需要手动在项目根目录(和
manage.py同级、也就是BASE_DIR指向的路径)下新建名为media的空文件夹。框架只会在首次上传文件时,自动创建upload_to参数指定的子目录(也就是你配置的trips/文件夹),不会帮你生成顶层media目录。 - 你的视图函数写法有致命错误:你手动给form实例赋值
form.photo = form.cleaned_data["photo"]是完全多余的,且会破坏ModelForm的默认保存逻辑——form实例本身没有对应模型的photo字段属性,你赋值的只是form实例的普通属性,执行save()时根本不会把文件写入磁盘。 - 额外检查项:
- 确认你启动项目用的Python环境里确实装了Pillow,别把包装到全局环境、但项目跑在虚拟环境里,在项目对应环境执行
pip show pillow能查到安装信息才算正确。 - 开发环境下要保证
settings.py里DEBUG = True,你写的static路由配置只在DEBUG模式下生效,生产环境需要用Nginx这类Web服务器托管media文件,Django本身不处理生产环境的静态/媒体文件请求。 - 你的HTML表单标签里
action="/createTrip"method="post"少了个空格,修正为action="/createTrip" method="post",避免部分浏览器解析表单属性失败。 - 确认
settings.py顶部已经导入了os模块,否则MEDIA_ROOT = os.path.join(BASE_DIR, 'media')配置会直接失效。
- 确认你启动项目用的Python环境里确实装了Pillow,别把包装到全局环境、但项目跑在虚拟环境里,在项目对应环境执行
修正后的视图代码
from django.shortcuts import render, redirect from .forms import TripForm def tripAdd(request): if request.method == 'POST': form = TripForm(request.POST, request.FILES) if form.is_valid(): # 如果你需要自动关联创建人,用commit=False拿到模型实例再赋值 trip = form.save(commit=False) # 下面这行是给creator字段赋值当前登录用户,不需要可以删掉,记得给视图加登录校验 # trip.creator = request.user trip.save() # 上传成功后做重定向,避免用户刷新页面重复提交表单 return redirect('/') # 替换成你自己要跳转的路径 else: form = TripForm() context = { 'form': form} return render(request, 'tripAdd.html', context)
其他配置说明
- 你写的urls.py里两种static配置写法效果完全一致,没有问题。
- forms.py、models.py的字段配置没有问题,
photo字段的null=True, blank=True配置正确。 - 表单的
enctype="multipart/form-data"属性配置正确,这是文件上传必须的属性,你这块没写错。
修复完成后重启开发服务器,重新提交带图片的表单,就会在media目录下自动生成trips子文件夹,上传的图片会存在里面,数据库中对应记录的photo字段会保存trips/你的文件名.jpg格式的路径。
内容的提问来源于stack exchange,提问作者Keith Coye
相关产品推荐
相关产品推荐

