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

Django Admin上传图片显示404错误(URL看似正确)

Django Admin媒体图片点击404错误的排查与解决

问题背景

作为Django新手,在页面显示图片时遭遇404错误,聚焦Admin站点场景:图片链接已正确带上http://.../media/前缀,图片也确实存放在对应目录(BASE_DIR为C:\Users\Admin\PycharmProjects\website_andalucia),但点击Admin中的图片链接仍触发404。

相关代码

catalog/settings.py

DEBUG = True
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# Base url to serve media files
MEDIA_URL = '/media/'
# Path where media is stored
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
print("base dir:", BASE_DIR)
print("media root:", MEDIA_ROOT)

my_project/models.py(重点看remark_image字段)

class remark(models.Model):
    # Fields
    activity = models.ForeignKey(activity, on_delete=models.CASCADE, null=True)
    remark_date = models.DateField(default=date.today)
    remark_desc = models.TextField(help_text='Enter your remark(s) here')
    remark_image = models.ImageField(upload_to='images/', null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

catalog/urls.py

urlpatterns = [
path('', views.index, name='index'),
path('activities/', views.activitiesView.as_view(), name='activities'),
path('activity/<int:pk>', views.activityDetailView.as_view(), name='activity-detail'),
path('my_activities/', views.userActivitiesView.as_view(), name='my_activities'),
path('add_activity/', views.add_activity, name='add_activity'),
path('activity/<int:pk>/add_remark/', views.add_remark, name='add_remark'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

my_project/urls.py

urlpatterns = [
path('admin/', admin.site.urls),
path('', RedirectView.as_view(url='catalog/', permanent=True)),
path('catalog/', include('catalog.urls')),
path('accounts/', include('django.contrib.auth.urls')),
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

排查与解决方法

  1. 调整媒体路由的配置位置
    Admin站点的URL直接挂载在根路由下,而你当前在子应用catalog/urls.py中配置媒体文件服务规则,导致Admin的图片请求走根路由时匹配不到媒体服务规则。需将媒体路由代码移到根URL配置my_project/urls.py中:

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', RedirectView.as_view(url='catalog/', permanent=True)),
        path('catalog/', include('catalog.urls')),
        path('accounts/', include('django.contrib.auth.urls')),
    ]
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    同时删除catalog/urls.py中对应的媒体路由代码。

  2. 验证MEDIA_ROOT与实际文件路径一致性
    检查打印的MEDIA_ROOT是否和实际存图目录完全匹配:Windows系统下注意路径大小写(比如代码中是media/images/,实际文件夹是否是Media/Images/),以及是否存在文件夹拼写错误。手动确认C:\Users\Admin\PycharmProjects\website_andalucia\media\images\下是否有对应图片文件。

  3. 确保DEBUG模式与服务器状态
    确认DEBUG = True未被误修改,因为static()函数仅在DEBUG模式下生效。修改路由配置后重启开发服务器,确保配置生效。

  4. 检查图片文件名合法性
    若图片文件名包含空格、中文或特殊字符,可能导致URL解析异常。尝试将文件名改为纯英文无空格格式(如test-image.jpg),重新上传后测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:07:05