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"配置,符合文件上传要求,无需修改。
验证方式
- 登录账号后进入商品添加页,填写商品标题、上传图片提交
- 查看数据库商品记录,确认图片路径正常写入、user字段自动关联为当前登录用户即可。
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

