Django遍历Model实例加载ImageField图片出现404错误求助
解决Django ImageField图片404问题
你的问题核心是混淆了用户上传的媒体文件(ImageField)和项目静态文件的处理逻辑,Django对这两类文件的存储、访问路径是分开管理的,以下是具体修复步骤:
1. 配置项目根目录的settings.py
在项目根目录的settings.py(而非todo应用下的settings)中添加媒体文件的存储路径与URL前缀:
# 媒体文件存储根目录,项目根会自动生成media文件夹 MEDIA_ROOT = BASE_DIR / 'media' # 媒体文件访问的URL前缀 MEDIA_URL = '/media/'
2. 修改项目根目录的urls.py
在项目根的urls.py中添加媒体文件的URL映射(而非todo应用的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), # 引入todo应用的路由配置 path('todo/', include('todo.urls')), ] # 仅DEBUG模式下提供媒体文件的静态服务 if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
3. 清理todo应用的urls.py
删除todo应用urls.py中多余的STATIC相关配置(那是给静态文件用的,和上传图片无关),修改后如下:
from django.urls import path from .views import GoodsList urlpatterns = [ path('goods_list/', GoodsList.as_view()), ]
4. 模板代码无需调整
你当前goods_list.html里的{{ good.pic.url }}写法是正确的,配置完成后它会自动生成/media/todo/goods_images/image_2023-04-03_224219080.png这类合法路径,图片即可正常加载。
补充说明
- ImageField的
upload_to='todo/goods_images'会让上传图片存储在media/todo/goods_images/目录下,和静态文件目录(static)完全隔离。 - 生产环境不能用
static()函数处理媒体文件,需依靠Nginx、Apache等Web服务器托管,但开发环境下DEBUG模式可直接用此方式调试。
内容的提问来源于stack exchange,提问作者KA RL
相关产品推荐
相关产品推荐

