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

Django图片上传失败求助:POST上传图片至数据库失败

Django图片上传失败问题排查与修复

我尝试用Django通过POST请求将图片上传至数据库并在站点展示,但图片无法上传,运行时网页出现如下错误:
Django上传错误截图

以下是我的相关代码文件:

models.py

from django.db import models


class image_classification(models.Model):
    pic=models.ImageField(upload_to='images')

views.py

from django.shortcuts import render
from .models import image_classification
from django.http import HttpResponse, HttpResponseRedirect


def home(request):
    print('here you go ')
    images=image_classification.objects.all()

    if len(images) > 0:
     url=images[len(images)-1].pic.url
    else:
      url="place holder image url"
    return render(request,'home.html',{'print':'everything is ok','image':url})

# 处理图片上传
def uploadImage(request):
    print('image handling ')
    img= request.FILES['image']
    image=image_classification(pic=img)
    image.save()
    return HttpResponseRedirect('/')

应用urls.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('',views.home,name='home')
]

urlpatterns+= static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

urlpatterns+= static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

项目urls.py

from django.contrib import admin
from django.urls import path, include
from ImageClassifier import views
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path("admin/", admin.site.urls),
    path('', include('ImageClassifier.urls')),
]

settings.py

MEDIA_ROOT= os.path.join(BASE_DIR,'ImageClassifier/media/')
MEDIA_URL= '/media/'


STATIC_URL = "/static/"
STATIC_ROOT= os.path.join(BASE_DIR, 'static')

问题分析与修复步骤

1. 缺失上传视图的URL映射

uploadImage视图未在URL配置中注册,导致POST请求找不到对应处理函数,这是核心问题之一。

修复:修改应用urls.py
添加上传视图的URL路径:

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', views.home, name='home'),
    path('upload/', views.uploadImage, name='upload_image')  # 新增该行
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2. 视图未处理非POST请求且无异常防护

uploadImage直接获取request.FILES['image'],若为GET请求或请求中无文件,会直接抛出错误。

修复:修改views.py中的uploadImage函数

def uploadImage(request):
    if request.method == 'POST':
        print('image handling ')
        img = request.FILES.get('image')  # 使用get避免键不存在时抛出KeyError
        if img:
            image = image_classification(pic=img)
            image.save()
            return HttpResponseRedirect('/')
    # 非POST请求或无文件时,重定向回首页
    return HttpResponseRedirect('/')

3. 上传表单未设置正确的enctype属性

上传文件的HTML表单必须添加enctype="multipart/form-data",否则Django无法解析文件上传请求。

修复:修改home.html中的表单

<form method="POST" action="{% url 'upload_image' %}" enctype="multipart/form-data">
    {% csrf_token %}  <!-- 必须添加CSRF令牌防止跨站请求伪造 -->
    <input type="file" name="image">
    <button type="submit">上传图片</button>
</form>

4. MEDIA_ROOT路径优化

MEDIA_ROOT末尾的斜杠可能导致路径解析问题,建议调整写法,并确保目录存在且有读写权限。

修复:修改settings.py

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

MEDIA_ROOT = os.path.join(BASE_DIR, 'ImageClassifier', 'media')  # 去掉末尾斜杠
MEDIA_URL = '/media/'

完成以上修改后,重启Django服务即可正常上传并展示图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:35:30