Django实现多文件上传与多对多外键保存的完整流程

键盘旁的猫
键盘旁的猫
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍如何在Django中通过Form表单实现多文件上传,包括文本、Log文件及多个图片。重点讲解如何处理ManyToMany外键关系,先保存子对象再关联主对象的实现方式,并附带Model、HTML及View层的完整代码示例。

需求分析与技术选型

需求明确:

需要开发一个用户反馈接口,该接口需接收用户提交的以下数据:

1. 一段文本描述

2. 一个Log日志文件

3. 多张图片文件

查阅了大量ModelForm和DRF Serializer的资料后,发现并未找到简单直接的解决方案,因此决定直接编写代码,不依赖额外复杂组件。

Model.py定义:

数据模型定义


class UserFeedback(models.Model):
 user = models.ForeignKey(User, verbose_name="用户")
 desc = models.TextField(default="", verbose_name=u'问题描述')
 logfile = models.FileField(upload_to='UserFeedback/%Y/%m/', 
 verbose_name=u'log文件',null=True, blank=True)
 submit_time = models.DateTimeField(default=datetime.now, verbose_name="提交时间")
 images=models.ManyToManyField("UserFeedbackImages",verbose_name=u'图片')
 
class UserFeedbackImages(models.Model):
 image = models.ImageField(upload_to='UserFeedbackImages/%Y/%m/',
  verbose_name=u'反馈图片', null=True, blank=True)

由于单个反馈可能包含多张图片,因此images字段定义为ManyToManyField(多对多关系)。

HTML前端代码:

前端表单实现


<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>用户反馈</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
 <textarea name="desc"></textarea>
 <input type="file" name="logfile">
 <input type="file" name="images" multiple>
 <button type="submit">提交</button>
</form>
</body>
</html>

在<form>标签中必须添加属性:

enctype="multipart/form-data"

同时在input标签中定义:

multiple

在View.py中,处理逻辑为:先保存所有图片对象,创建反馈主记录后,再将图片与反馈进行关联。

后端视图处理逻辑


class feedback(LoginRequiredMixin,APIView):
 def post(self, request):
  #save all images
  ret={}
  try:
   imgs=[]
   for payload in request.data.getlist("images"):
    img=UserFeedbackImages.objects.create(image=payload)
    imgs.append(img)  
   ufb=UserFeedback.objects.create(user=request.user,
   desc=request.POST.get("desc"),
   logfile=request.data.get("logfile"))
   for img in imgs:
    ufb.images.add(img)
   ufb.save()
   ret["status"]="success"
  except Exception as e:
   ret["status"]="fail"
   ret["msg"]=str(e)
  return Response(json.dumps(ret))

这种实现方式简单直接,易于理解,特此记录。

以上关于Django多文件上传、Form提交及多对多外键保存的实例内容分享完毕,希望能为读者提供参考,欢迎支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表