Django Admin上传图片显示404错误(URL看似正确)
问题背景
作为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)
排查与解决方法
调整媒体路由的配置位置
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中对应的媒体路由代码。验证MEDIA_ROOT与实际文件路径一致性
检查打印的MEDIA_ROOT是否和实际存图目录完全匹配:Windows系统下注意路径大小写(比如代码中是media/images/,实际文件夹是否是Media/Images/),以及是否存在文件夹拼写错误。手动确认C:\Users\Admin\PycharmProjects\website_andalucia\media\images\下是否有对应图片文件。确保DEBUG模式与服务器状态
确认DEBUG = True未被误修改,因为static()函数仅在DEBUG模式下生效。修改路由配置后重启开发服务器,确保配置生效。检查图片文件名合法性
若图片文件名包含空格、中文或特殊字符,可能导致URL解析异常。尝试将文件名改为纯英文无空格格式(如test-image.jpg),重新上传后测试。
内容的提问来源于stack exchange,提问作者Nils

