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

Django项目图片可上传但模板无法访问(404错误)求助

Django媒体图片上传后404的解决方案

看起来你已经成功把图片上传到了catalog/media/images/路径,但前端显示占位图+404,这种情况我之前也碰到过,大多是媒体文件的路由或者路径配置的小细节没处理好,咱们一步步来排查修复:

1. 先确认MEDIA_ROOT的路径写法是否规范

你当前的MEDIA_ROOT是:

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

虽然你说图片已经传到了正确位置,但用os.path.join的时候,应该用逗号分隔每个目录层级,而不是把目录写成一个字符串——这样能避免不同操作系统(Windows/Linux)下的路径分隔符问题,改成:

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

2. 把媒体文件路由移到项目根urls.py中

你现在是在app的catalog/urls.py里配置了媒体路由,但Django的媒体文件服务路由应该放在项目根目录的urls.py里(就是和settings.py同层级的那个urls文件)。修改后的根urls.py应该是这样:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('catalog.urls')),  # 这里包含你的catalog app路由
]

# 只在开发环境(DEBUG=True)下启用Django自带的媒体文件服务
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这样Django才能正确捕获/media/开头的请求,映射到你指定的MEDIA_ROOT路径。

3. 确认DEBUG模式处于开启状态

检查settings.py里的DEBUG = True——因为Django的static()函数只有在DEBUG为True时才会生效,生产环境下我们不会用Django来处理媒体文件(得用Nginx/Apache这类服务器),如果DEBUG关了,自然会返回404。

4. 验证生成的URL和文件路径是否匹配

在模板里临时打印出完整的图片URL,确认路径是否正确:

<p>当前图片URL:{{ book.image.url }}</p>
<img src="{{ book.image.url}}" width="250">

比如生成的URL应该是/media/images/screenshot_4.png,然后直接在浏览器地址栏访问http://localhost:8000/media/images/screenshot_4.png,同时确认你的文件确实存在于BASE_DIR/catalog/media/images/screenshot_4.png这个路径,并且Django有读取该文件的权限(比如不要给文件设成只读)。

5. 最后别忘了重启开发服务器

修改完settings或者urls之后,一定要重启Django的开发服务器,否则新配置不会生效!

做完这些步骤,你的图片应该就能正常显示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:52:20