Django模板图片无法显示,浏览器报404错误求助
Django模板图片无法显示的解决方法
核心问题定位
你的配置里存在两个关键冲突点:
- ImageField的
upload_to='static/assets'会把上传的图片存到MEDIA_ROOT/static/assets/目录下,但你手动把图片放在了media应用的static/assets文件夹里,两者路径完全不匹配。 - 浏览器显示的
/static/assets/xxx.jpg是Django根据upload_to生成的URL,但这个路径被路由到静态文件服务,而你的图片并不在项目或应用的static目录的对应位置,同时media路由只处理/media/开头的URL,所以访问这个路径必然报404。
具体修复步骤
1. 修正ImageField的upload_to配置
打开models.py,把article_image字段的upload_to改为不包含static的路径,比如:
class MediaModule(models.Model): article_image = models.ImageField(upload_to='assets/')
这样上传的图片会被存到MEDIA_ROOT/assets/目录下,生成的URL会是/media/assets/xxx.jpg,和你配置的MEDIA_URL完全匹配。
2. 调整图片存放位置
把media应用/static/assets/image.jpg移动到项目目录/media/assets/image.jpg(如果MEDIA_ROOT对应的media文件夹下没有assets目录,手动创建即可)。
3. 验证模板中的URL引用
模板里保持{{ article.article_image.url }}即可,现在它会正确输出/media/assets/image.jpg,这个路径会被你配置的media路由正常处理。
4. 确认urls.py的media路由配置
确保项目根urls.py里的media路由配置正确:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 你的其他路由配置 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
额外注意事项
- 不要把用户上传的媒体文件放到static文件夹里,static文件夹是用来存放项目开发阶段的静态资源(如CSS、JS、默认图标等),用户上传的动态文件应该放在
MEDIA_ROOT对应的目录下,由media路由专门处理。 - DEBUG模式下Django会自动处理media文件的服务,生产环境需要配置反向代理(如Nginx)来直接处理media文件的请求,避免通过Django服务转发。
内容的提问来源于stack exchange,提问作者James Sinclair
相关产品推荐
相关产品推荐

