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

Django商品添加表单自动存用户、修复图片上传入库问题

Django商品添加表单异常修复方案

问题定位

  • 图片上传存储失败:视图初始化表单时未传入request.FILES参数,Django无法接收multipart格式提交的文件数据。
  • 无法记录商品添加人:表单保存逻辑未关联当前登录用户,且接口未做登录校验,未登录状态下无法获取操作人信息。
  • 隐性运行bug:GET请求渲染表单时直接传入表单类而非实例化对象,会导致表单渲染异常。

逐文件修复代码

forms.py

原有逻辑无问题,可直接保留,类名建议遵循大驼峰规范(非强制):

from django import forms
from .models import Products
from django.forms import ModelForm

class AddProductForm(forms.ModelForm):
    class Meta:
        model = Products
        fields = ('product_title','product_image')

models.py

建议调整字段约束,避免产生无关联用户的脏数据(原有代码可运行,按需修改):

from django.db import models
from django.contrib.auth.models import User

class Products(models.Model):
    # 移除null、blank配置,强制要求关联用户
    user = models.ForeignKey(User, related_name="merchandise_product_related_name", on_delete=models.CASCADE)
    product_title = models.CharField(max_length=250)
    product_image = models.ImageField(upload_to="1_products_img")

前置依赖说明:

  • ImageField依赖Pillow库,未安装需执行pip install pillow
  • 需在settings.py中配置媒体文件存储路径:
import os
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • 开发环境需在根路由urls.py中添加媒体文件访问配置:
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 原有路由配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

views.py(核心修复)

修复文件传参、用户关联、表单实例化三个问题,增加登录校验:

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
# 如果修改了表单类名,这里对应替换
from .forms import AddProductForm

# 替换login_url为你项目的实际登录地址
@login_required(login_url='/login/')
def add_product(request):
    if request.method == "POST":
        # 传入request.FILES接收上传的图片数据
        form = AddProductForm(request.POST, request.FILES)
        if form.is_valid():
            # commit=False先不写入数据库,拿到模型实例
            product = form.save(commit=False)
            # 绑定当前登录的操作用户
            product.user = request.user
            product.save()
            messages.success(request, "商品添加成功")
            return redirect("add_product")
    else:
        # GET请求实例化空表单
        form = AddProductForm()
    
    context = {"form": form}
    return render(request, "add_product.html", context)

模板文件

原有代码已正确添加enctype="multipart/form-data"配置,符合文件上传要求,无需修改。


验证方式

  1. 登录账号后进入商品添加页,填写商品标题、上传图片提交
  2. 查看数据库商品记录,确认图片路径正常写入、user字段自动关联为当前登录用户即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:18:07