Django自定义表单提交图片无法存储,Admin面板提交正常问题求助
Django自定义表单图片未保存问题排查与解决
问题原因
- 前端表单未设置文件上传编码:上传文件的表单必须添加
enctype="multipart/form-data",否则文件数据无法被后端正确接收。 - 后端获取文件方式错误:上传的文件数据存储在
request.FILES中,而非request.POST,用request.POST.get()只能拿到文件名,拿不到实际文件对象。 - 字段赋值错误:直接将字符串(文件名)传给
ImageField,Django无法识别并执行文件保存操作。
解决方案
1. 修改前端表单,添加文件上传编码
<form method="post" action="/index" enctype="multipart/form-data"> {% csrf_token %} <div>Dish name: <input name="dish_name" type="text" placeholder="Dish name"></div> <div>Dish category: <input name="dish_category" type="text" placeholder="Dish category"></div> <div>Dish size: <input name="dish_size" type="text" placeholder="Dish size"></div> <div>Dish price: <input name="dish_price" type="text" placeholder="Dish price"></div> <div>Dish description: <input name="dish_description" type="text" placeholder="Dish description"></div> <div>Dish image: <input name="dish_image" type="file"></div> <button type="submit" class="btn btn-success">Submit</button> </form>
2. 修改后端视图,正确获取并保存文件
from django.shortcuts import render import datetime def index(request): if request.method == "POST": dish_name = request.POST.get('dish_name') dish_size = request.POST.get('dish_size') dish_price = request.POST.get('dish_price') dish_description = request.POST.get('dish_description') # 从request.FILES中获取上传的文件对象 dish_image = request.FILES.get('dish_image') dish_category = request.POST.get('dish_category') item = dish( dish_name=dish_name, dish_size=dish_size, dish_price=dish_price, dish_description=dish_description, dish_category=dish_category, dish_image=dish_image, dish_date=datetime.today() ) item.save() dishs = dish.objects.all() params = {'dish': dishs} return render(request, "card/index.html", params)
3. 补充媒体文件访问路由(可选但推荐)
在项目根目录的urls.py中添加媒体文件访问路由,确保前端能正常访问上传的图片:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 已有的其他路由配置 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
额外优化点
models.py中的dish_id字段定义不完整,应修改为:
dish_id = models.AutoField(primary_key=True)
否则Django会自动创建名为id的主键字段,dish_id不会生效。
内容的提问来源于stack exchange,提问作者Path Parakh
相关产品推荐
相关产品推荐

