Django FileField 的 upload_to 动态设置
我想设置上传功能,让用户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函数中覆盖这个文件名。