Django运行无报错却无法将图片保存到数据库是什么原因?
问题原因及修复方案
1. 模板文件上传框缺失正确name属性(核心问题)
你模板里的文件输入框name属性为空,Django表单依靠name值匹配对应字段,无法拿到上传的文件数据,所以校验不会通过自然不会触发保存逻辑。
修改后的模板代码:
<div class="container"> <form enctype="multipart/form-data" action="" method="post"> {% csrf_token%} <hr><br><br> <!-- 把name属性值设为和模型/表单对应的image字段 --> <input type="file" name="image" id="image" required/> <br><br> <input type="submit" class="btn btn danger" value="Upload"> </form> </div>
2. 视图逻辑遗漏必要配置
- 视图渲染模板时没有把表单实例传入上下文,后续如果需要用Django表单的自动渲染、错误提示功能都会失效
- POST请求处理完成后没有做重定向,提交成功后刷新页面会触发重复提交
修改后的视图代码:
from django.shortcuts import redirect, render def IndexView(request): print("index view..") if request.method == 'POST': print("post") form = ImageForm(request.POST, request.FILES) print("form {}".format(form)) if form.is_valid(): print("valid..") form.save() # 保存成功后重定向到当前页避免重复提交 return redirect(request.path_info) # 校验失败时可以打印错误信息方便定位 else: print(form.errors) form = ImageForm() # 把表单实例传入模板上下文 return render(request, "index.html", {'form': form})
3. 确认配套配置正确
- 检查
forms.py里的ImageForm是关联了MyImage模型的ModelForm,示例配置如下:
from django import forms from .models import MyImage class ImageForm(forms.ModelForm): class Meta: model = MyImage fields = ['image'] # 必须包含image字段才能正常接收保存数据
- 检查
settings.py里配置了媒体文件存储参数,否则图片无法写入本地磁盘:
# settings.py 添加以下配置 import os MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
- 开发环境下需要在项目根路由
urls.py里添加媒体文件的访问路由:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 你的其他业务路由 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
修改完成后即可正常把图片路径存入数据库,同时实体文件会保存到本地media/myimage目录下。
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

