Django文件字段,上传时间在runtim确定

2024-05-15 01:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试设置我的上载,以便如果用户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开始,你可以定义自己的函数来处理上传,但是这个函数也不知道用户是谁,所以我有点迷茫。

谢谢你的帮助!


Tags: 文件函数用户name模型model定义models
3条回答

你可能已经读过the documentation,下面是一个简单的例子来说明这一点:

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)

如您所见,您甚至不需要使用给定的文件名-如果您愿意,也可以在上载中重写该文件名以调用。

关于使用“instance”对象的pk值的说明。根据文件:

In most cases, this object will not have been saved to the database yet, so if it uses the default AutoField, it might not yet have a value for its primary key field.

因此,使用pk的有效性取决于如何定义您的特定模型。

这真的很有帮助。为了简洁起见,决定在我的案例中使用lambda:

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

相关问题 更多 >

    热门问题