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

本文介绍了一个简单的用户反馈接口实现方案,包括模型定义、HTML表单设计及后端处理逻辑,适用于上传文字描述、日志文件及多张图片的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

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

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))

这样简单粗暴,也容易理解。这里记录下。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值