如何将外键User模型的username作为FileField的上传目录?
解决方法
你的代码存在两个关键问题:
upload_to=get_media_path()中加了括号,这会直接执行函数并将返回值传给upload_to,而不是传递函数本身供Django在上传时调用- 将
get_media_path定义为模型方法,不符合upload_to对可调用对象的参数要求
下面是正确的实现方式:
方式一:使用独立函数(推荐)
from django.db import models from django.utils.text import slugify # 可选,用于处理用户名中的特殊字符 def get_media_path(instance, filename): # 对用户名做slug处理,避免特殊字符导致路径错误 safe_username = slugify(instance.user.username) # 返回相对MEDIA_ROOT的路径:用户名/文件名 return f'{safe_username}/{filename}' class Files(models.Model): name = models.CharField(max_length=50) # Django3.0+ ForeignKey必须指定on_delete参数,这里用CASCADE表示用户删除时文件记录也删除 user = models.ForeignKey(to='User', on_delete=models.CASCADE) # 这里直接传函数引用,不要加括号 file = models.FileField(upload_to=get_media_path) created = models.DateTimeField(auto_now_add=True)
说明
- 当Django处理文件上传时,会自动调用
get_media_path,传入当前的Files实例和上传的文件名 - 返回的路径会让文件保存到
MEDIA_ROOT/用户名/目录下 - 使用
slugify可以将用户名中的特殊字符转换为安全的路径格式,避免出现无效路径
内容的提问来源于stack exchange,提问作者Khushal
相关产品推荐
相关产品推荐

