You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:05