Django的FileField与upload_to在运行时确定
我试图设置我的上传,所以如果用户joe上传文件,它将进入MEDIA_ROOT /乔,而不是让每个人的文件进入MEDIA_ROOT。 问题是我不知道如何在模型中定义这个。 这是目前的样子:
class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file = models.FileField(upload_to='.')
所以我想要的是“而不是”。 作为upload_to,让它成为用户的名字。
我知道,从Django 1.0开始,你可以定义你自己的函数来处理upload_to,但是这个函数不知道用户是谁,所以我有点迷路了。
谢谢您的帮助!
你可能已经阅读过文档了 ,所以这里有一个简单的例子来说明它的意义:
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 callable中覆盖它。
这真的有帮助。 为了更简洁起见,决定在我的情况下使用lambda:
file = models.FileField( upload_to=lambda instance, filename: '/'.join(['mymodel', str(instance.pk), filename]), )
关于使用“实例”对象的PK值的说明。 根据文件:
在大多数情况下,这个对象还没有被保存到数据库中,所以如果它使用默认的AutoField,它可能还没有它的主键字段的值。
因此使用PK的有效性取决于你的特定模型是如何定义的。