需求:
需要实现一个用户反馈的接口,用户通过接口提交:
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字段是ManyToMany
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提交,多对多外键保存的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。