ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Django数据库存图片实战:dj4e-samples pics示例ImageField完整指南

Django数据库存图片实战:dj4e-samples pics示例ImageField完整指南 Django数据库存图片实战dj4e-samples pics示例ImageField完整指南【免费下载链接】dj4e-samplesDjango For Everybody Sample Code项目地址: https://gitcode.com/gh_mirrors/dj/dj4e-samples如何在 Django 数据库里存图片这是每个 Django 新手都会遇到的问题。本文基于 GitHub 加速计划开源项目 dj4e-samplesDjango For Everybody 官方示例代码中的pics应用带你 5 步完成图片上传、入库、展示的完整实战。和常见的ImageField图片存到磁盘不同pics 示例演示了另一条路线把图片的二进制字节直接存进数据库表。这种方案简单直接、备份方便特别适合学习 Django 文件上传与数据流的基本功。1️⃣ 一键运行5分钟启动 pics 示例应用先克隆并初始化项目Django 5.2 环境git clone https://gitcode.com/gh_mirrors/dj/dj4e-samples cd dj4e-samples pip install -r requirements52.txt python manage.py migrate python manage.py createsuperuser --username dj4e-samples python manage.py runserver启动后访问http://localhost:8000/pics/就能看到图片列表页面。完整的安装说明见 README.md。pics应用的核心文件结构如下值得留意模型定义pics/models.py上传表单pics/forms.py视图与图片流pics/views.py路由配置pics/urls.py2️⃣ 数据库存图片的关键BinaryField 模型设计打开 pics/models.pyPic模型中最关键的两个字段picture models.BinaryField(nullTrue, blankTrue, editableTrue) content_type models.CharField(max_length256, nullTrue, blankTrue)原理拆解字段作用pictureBinaryField用 BLOB 类型直接在数据库里存图片的原始字节content_type记录 MIME 类型如image/png回显时告诉浏览器该按什么格式渲染模型改完后只需执行python manage.py migrate生成数据表迁移历史可参考 pics/migrations/0001_initial.py。3️⃣ 表单上传文件字段 2MB 大小校验上传页面 pics/templates/pics/form.html 中有两个必须记住的细节表单必须加enctypemultipart/form-data否则浏览器不会把文件上传给服务器上传大小做了双重校验前端 JavaScript 先拦截超大文件后端表单再兜底。后端校验逻辑在 pics/forms.py 中max_upload_limit 2 * 1024 * 1024 # 2MB if len(pic) self.max_upload_limit: self.add_error(picture, File must be 2MB)表单的save()方法是入库的关键一步它读取上传文件的字节f.read()同时取出f.content_type把两者分别写入picture和content_type字段图片就这样落进了数据库。4️⃣ 图片展示stream_file 视图把字节流回浏览器存进去还要能显示出来。pics/urls.py 里注册了路由pic_picture/int:pk对应 pics/views.py 中的stream_file视图response HttpResponse() response[Content-Type] pic.content_type # 告诉浏览器图片格式 response[Content-Length] len(pic.picture) response.write(pic.picture)详情页 pics/templates/pics/detail.html 用一行img src{% url pics:pic_picture pic.id %}即可展示图片点击还能弹出全屏预览。⚠️常见报错排查图片显示不出来先检查content_type是否为空浏览器无法识别格式上传 413 错误说明超过了服务器DATA_UPLOAD_MAX_MEMORY_SIZE限制。5️⃣ 方案对比数据库存字节 vs ImageField 存文件对比维度数据库 BLOB 存储本示例Django ImageField文件存储存储位置数据库表内磁盘 数据库只存文件名配置难度低一个字段搞定需配置MEDIA_URL/MEDIA_ROOT静态文件服务无需 Nginx 处理生产环境需静态文件方案适合场景小图片、教学、轻量应用大量图片、生产项目✅结论学原理、存小图用BinaryField直接入库最省心正式项目图片量大时再用 Django 标准的ImageField走磁盘存储路线。 到这里你就完整走通了上传 → 校验 → 入库 → 回显的图片存储全流程。如果想继续练习可以参考同项目里的 favs 应用 做文字版收藏或阅读 pics/humanize.py 了解文件大小的友好显示技巧。动手跑一遍比看十篇教程都管用【免费下载链接】dj4e-samplesDjango For Everybody Sample Code项目地址: https://gitcode.com/gh_mirrors/dj/dj4e-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表