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

