Django实现多文件上传与多对多外键保存的完整流程
本文介绍如何在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提交及多对多外键保存的实例内容分享完毕,希望能为读者提供参考,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









