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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:15:34