Django如何将上传文件存储到指定自定义文件夹(多对多字段场景)
先修正代码笔误
你在forms.py中定义的多文件字段名是Files_Form_Label,但视图里request.FILES.getlist传入的是File_Form_Label,少了开头的s,会导致拿不到上传的文件,需要先统一字段名。
另外Django的ManyToManyField不需要设置on_delete参数,你原models.py里的相关写法会报错,需要删掉。
解决方案
多对多场景下不需要调整原有关联逻辑,直接按以下步骤修改即可实现MEDIAROOT/用户名/线程ID/的路径存储需求:
步骤1:调整models.py的字段定义
# models.py 补充导入 import os from django.conf import settings class Thread(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) Title = models.CharField(max_length=30) Media = models.ManyToManyField("Files") # 删除多余的on_delete参数 class Files(models.Model): # upload_to可以留空,我们后续手动指定存储路径 File = models.FileField()
步骤2:修改视图层的文件保存逻辑
你在保存Files实例前已经拿到了已创建完成的new_threadID和当前用户名,直接在循环中手动指定存储路径即可:
# views.py post方法的循环部分修改为如下代码 for f in all_files: # 拼接目标相对路径(相对于MEDIA_ROOT) target_path = os.path.join(request.user.username, str(new_thread.id), f.name) file = Files() # 第一个参数为存储路径,第二个为上传的文件对象,save=False避免重复保存实例 file.File.save(target_path, f, save=False) file.save() new_thread.Media.add(file)
Django会自动创建不存在的层级目录,不需要提前手动新建文件夹,只需确保MEDIA_ROOT根目录有程序写入权限即可。
内容的提问来源于stack exchange,提问作者Verma
相关产品推荐
相关产品推荐

