首页 > 编程 > Python > 正文

django多文件上传,form提交,多对多外键保存的实例

2019-11-25 12:05:26
字体:
来源:转载
供稿:网友

需求:

需要实现一个用户反馈的接口,用户通过接口提交:

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提交,多对多外键保存的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表