Django FileField 的 upload_to 动态设置

150 投票
6 回答
76272 浏览
提问于 2025-04-15 13:12

我想设置上传功能,让用户joe上传的文件存到MEDIA_ROOT/joe这个文件夹,而不是所有人的文件都放到MEDIA_ROOT里。现在的问题是,我不知道该怎么在模型里定义这个。现在的代码是这样的:

class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to='.')

所以我想要的不是用'.'作为上传路径,而是用用户的名字。

我知道从Django 1.0开始,你可以定义自己的函数来处理upload_to,但这个函数也不知道用户是谁,所以我有点迷茫。

谢谢你的帮助!

6 个回答

5

关于使用“实例”对象的主键(pk)值,有一点需要注意。根据文档的说明:

在大多数情况下,这个对象可能还没有保存到数据库里,所以如果它使用的是默认的自动字段(AutoField),那么它的主键字段可能还没有值。

因此,使用主键的有效性取决于你具体是怎么定义你的模型的。

13

这真的帮了我很多。为了让内容更简洁,我决定在我的情况下使用lambda:

file = models.FileField(
    upload_to=lambda instance, filename: '/'.join(['mymodel', str(instance.pk), filename]),
)
281

你可能已经看过文档,这里有个简单的例子来帮助你理解:

def content_file_name(instance, filename):
    return '/'.join(['content', instance.user.username, filename])

class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to=content_file_name)

如你所见,你甚至不需要使用提供的文件名 - 如果你愿意,也可以在你的upload_to函数中覆盖这个文件名。

撰写回答