Django表单图片上传失败:POST / 404未找到问题求助
Django图片上传出现「404 POST / not found」错误排查解决
问题描述
开发支持用户上传图片至Django的网页时,点击上传按钮后出现「404 POST / not found」错误,无法完成图片上传操作。
相关代码配置
HTML代码
<form action="." method="POST" enctype="multipart/form-data"> {% csrf_token %} {{form.as_p}} <button type="submit" class="btn btn-lg btn-success">Upload</button> </form>
settings.py
STATIC_URL = 'static/' MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR,'media') STATICFILES_DIRS = (os.path.join(BASE_DIR,"static"), )
Lightings应用models.py
from django.db import models from django.contrib.auth.models import User class MovieImage(models.Model): image_upload=models.ImageField(null=True,blank=True,upload_to="userimages/")
Lightings应用forms.py
from django import forms from .models import * class MovieImageForm(forms.ModelForm): class Meta: model=MovieImage fields=('image_upload',) labels={ 'image_upload':'', }
Lightings应用views.py
from django.shortcuts import render from .forms import MovieImageForm from .models import * def startlighting(request): return render(request,'Lightings.html') def index(request): if request.method == "POST": form=MovieImageForm(request.POST,request.FILES) if form.is_valid(): form.save() return render(request,"Lightings.html") else: form=MovieImageForm() return render(request,'Lightings.html',{'form':form})
项目级urls.py
from django.contrib import admin from django.urls import path,include from homepage.views import start from About.views import aboutstart from Lightings.views import startlighting from django.conf import settings from django.conf.urls.static import static from Lightings.views import * urlpatterns = [ path('admin/', admin.site.urls), path("home",start), path("About",aboutstart), path("Lightings",startlighting), path("Lightings",index) ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
报错截图

问题原因分析
- 路由重复与缺失:项目urls.py中存在两个相同的
path("Lightings", ...),Django会优先匹配第一个startlighting视图,导致处理上传逻辑的index视图无法被访问;同时缺少根路径(/)的路由配置,若用户直接访问根路径,表单提交到/时无对应处理视图,引发404。 - 视图与表单不匹配:
startlighting视图仅返回模板,未传递表单对象,且不处理POST请求,若用户通过/Lightings访问页面,表单提交后无法被正确处理。 - 表单action相对路径问题:表单
action="."会提交到当前页面URL,若当前URL对应的视图无POST处理逻辑,就会触发404。
解决方案
1. 修正URL路由配置
修改项目级urls.py,确保路由唯一且正确映射到处理上传的视图:
from django.contrib import admin from django.urls import path,include from homepage.views import start from About.views import aboutstart from Lightings.views import index from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path("home", start), path("About", aboutstart), # 将/Lightings映射到处理上传的index视图 path("Lightings", index), # 可选:添加根路径路由,让用户访问/也能使用上传功能 path("", index) ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 优化视图逻辑(可选)
合并冗余视图,确保index视图同时处理表单显示与上传逻辑:
# Lightings/views.py from django.shortcuts import render from .forms import MovieImageForm def index(request): if request.method == "POST": form = MovieImageForm(request.POST, request.FILES) if form.is_valid(): form.save() # 上传成功后重置表单,避免重复提交 return render(request, "Lightings.html", {"form": MovieImageForm()}) else: form = MovieImageForm() return render(request, "Lightings.html", {'form': form}) # 可删除无用的startlighting视图
3. 确认表单action配置
将表单action指定为明确的上传路径,避免相对路径问题:
<form action="/Lightings" method="POST" enctype="multipart/form-data"> {% csrf_token %} {{form.as_p}} <button type="submit" class="btn btn-lg btn-success">Upload</button> </form>
4. 验证依赖与数据库迁移
确保安装了处理图片所需的Pillow库,执行数据库迁移:
pip install pillow python manage.py makemigrations python manage.py migrate
验证
启动Django服务器,访问/Lightings或/,上传图片后检查media/userimages/目录是否生成上传的图片,确认无404错误。
内容的提问来源于stack exchange,提问作者Tharun nivek
相关产品推荐
相关产品推荐

